browser/base/content/test/general/browser_aboutAccounts.js

Wed, 31 Dec 2014 06:09:35 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:09:35 +0100
changeset 0
6474c204b198
permissions
-rw-r--r--

Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.

     1 /* Any copyright is dedicated to the Public Domain.
     2  * http://creativecommons.org/publicdomain/zero/1.0/
     3  */
     5 XPCOMUtils.defineLazyModuleGetter(this, "Promise",
     6   "resource://gre/modules/Promise.jsm");
     7 XPCOMUtils.defineLazyModuleGetter(this, "Task",
     8   "resource://gre/modules/Task.jsm");
     9 XPCOMUtils.defineLazyModuleGetter(this, "fxAccounts",
    10   "resource://gre/modules/FxAccounts.jsm");
    12 const CHROME_BASE = "chrome://mochitests/content/browser/browser/base/content/test/general/";
    13 // Preference helpers.
    14 let changedPrefs = new Set();
    16 function setPref(name, value) {
    17   changedPrefs.add(name);
    18   Services.prefs.setCharPref(name, value);
    19 }
    21 registerCleanupFunction(function() {
    22   // Ensure we don't pollute prefs for next tests.
    23   for (let name of changedPrefs) {
    24     Services.prefs.clearUserPref(name);
    25   }
    26 });
    28 let gTests = [
    29 {
    30   desc: "Test the remote commands",
    31   teardown: function* () {
    32     gBrowser.removeCurrentTab();
    33     yield fxAccounts.signOut();
    34   },
    35   run: function* ()
    36   {
    37     setPref("identity.fxaccounts.remote.signup.uri",
    38             "https://example.com/browser/browser/base/content/test/general/accounts_testRemoteCommands.html");
    39     yield promiseNewTabLoadEvent("about:accounts");
    41     let deferred = Promise.defer();
    43     let results = 0;
    44     try {
    45       let win = gBrowser.contentWindow;
    46       win.addEventListener("message", function testLoad(e) {
    47         if (e.data.type == "testResult") {
    48           ok(e.data.pass, e.data.info);
    49           results++;
    50         }
    51         else if (e.data.type == "testsComplete") {
    52           is(results, e.data.count, "Checking number of results received matches the number of tests that should have run");
    53           win.removeEventListener("message", testLoad, false, true);
    54           deferred.resolve();
    55         }
    57       }, false, true);
    59     } catch(e) {
    60       ok(false, "Failed to get all commands");
    61       deferred.reject();
    62     }
    63     yield deferred.promise;
    64   }
    65 },
    66 {
    67   desc: "Test action=signin - no user logged in",
    68   teardown: () => gBrowser.removeCurrentTab(),
    69   run: function* ()
    70   {
    71     // When this loads with no user logged-in, we expect the "normal" URL
    72     const expected_url = "https://example.com/?is_sign_in";
    73     setPref("identity.fxaccounts.remote.signin.uri", expected_url);
    74     let [tab, url] = yield promiseNewTabWithIframeLoadEvent("about:accounts?action=signin");
    75     is(url, expected_url, "action=signin got the expected URL");
    76     // we expect the remote iframe to be shown.
    77     yield checkVisibilities(tab, {
    78       stage: false, // parent of 'manage' and 'intro'
    79       manage: false,
    80       intro: false, // this is  "get started"
    81       remote: true
    82     });
    83   }
    84 },
    85 {
    86   desc: "Test action=signin - user logged in",
    87   teardown: function* () {
    88     gBrowser.removeCurrentTab();
    89     yield signOut();
    90   },
    91   run: function* ()
    92   {
    93     // When this loads with a user logged-in, we expect the normal URL to
    94     // have been ignored and the "manage" page to be shown.
    95     const expected_url = "https://example.com/?is_sign_in";
    96     setPref("identity.fxaccounts.remote.signin.uri", expected_url);
    97     yield setSignedInUser();
    98     let tab = yield promiseNewTabLoadEvent("about:accounts?action=signin");
    99     // about:accounts initializes after fetching the current user from Fxa -
   100     // so we also request it - by the time we get it we know it should have
   101     // done its thing.
   102     yield fxAccounts.getSignedInUser();
   103     // we expect "manage" to be shown.
   104     yield checkVisibilities(tab, {
   105       stage: true, // parent of 'manage' and 'intro'
   106       manage: true,
   107       intro: false, // this is  "get started"
   108       remote: false
   109     });
   110   }
   111 },
   112 {
   113   desc: "Test action=signup - no user logged in",
   114   teardown: () => gBrowser.removeCurrentTab(),
   115   run: function* ()
   116   {
   117     const expected_url = "https://example.com/?is_sign_up";
   118     setPref("identity.fxaccounts.remote.signup.uri", expected_url);
   119     let [tab, url] = yield promiseNewTabWithIframeLoadEvent("about:accounts?action=signup");
   120     is(url, expected_url, "action=signup got the expected URL");
   121     // we expect the remote iframe to be shown.
   122     yield checkVisibilities(tab, {
   123       stage: false, // parent of 'manage' and 'intro'
   124       manage: false,
   125       intro: false, // this is  "get started"
   126       remote: true
   127     });
   128   },
   129 },
   130 {
   131   desc: "Test action=signup - user logged in",
   132   teardown: () => gBrowser.removeCurrentTab(),
   133   run: function* ()
   134   {
   135     const expected_url = "https://example.com/?is_sign_up";
   136     setPref("identity.fxaccounts.remote.signup.uri", expected_url);
   137     yield setSignedInUser();
   138     let tab = yield promiseNewTabLoadEvent("about:accounts?action=signup");
   139     yield fxAccounts.getSignedInUser();
   140     // we expect "manage" to be shown.
   141     yield checkVisibilities(tab, {
   142       stage: true, // parent of 'manage' and 'intro'
   143       manage: true,
   144       intro: false, // this is  "get started"
   145       remote: false
   146     });
   147   },
   148 },
   149 {
   150   desc: "Test action=reauth",
   151   teardown: function* () {
   152     gBrowser.removeCurrentTab();
   153     yield signOut();
   154   },
   155   run: function* ()
   156   {
   157     const expected_url = "https://example.com/?is_force_auth";
   158     setPref("identity.fxaccounts.remote.force_auth.uri", expected_url);
   159     let userData = {
   160       email: "foo@example.com",
   161       uid: "1234@lcip.org",
   162       assertion: "foobar",
   163       sessionToken: "dead",
   164       kA: "beef",
   165       kB: "cafe",
   166       verified: true
   167     };
   169     yield setSignedInUser();
   170     let [tab, url] = yield promiseNewTabWithIframeLoadEvent("about:accounts?action=reauth");
   171     // The current user will be appended to the url
   172     let expected = expected_url + "&email=foo%40example.com";
   173     is(url, expected, "action=reauth got the expected URL");
   174   },
   175 },
   176 {
   177   desc: "Test observers about:accounts",
   178   teardown: function() {
   179     gBrowser.removeCurrentTab();
   180   },
   181   run: function* () {
   182     setPref("identity.fxaccounts.remote.signup.uri", "https://example.com/");
   183     yield setSignedInUser();
   184     let tab = yield promiseNewTabLoadEvent("about:accounts");
   185     // sign the user out - the tab should have action=signin
   186     yield signOut();
   187     // wait for the new load.
   188     yield promiseOneMessage(tab, "test:document:load");
   189     is(tab.linkedBrowser.contentDocument.location.href, "about:accounts?action=signin");
   190   }
   191 },
   192 ]; // gTests
   194 function test()
   195 {
   196   waitForExplicitFinish();
   198   Task.spawn(function () {
   199     for (let test of gTests) {
   200       info(test.desc);
   201       try {
   202         yield test.run();
   203       } finally {
   204         yield test.teardown();
   205       }
   206     }
   208     finish();
   209   });
   210 }
   212 function promiseOneMessage(tab, messageName) {
   213   let mm = tab.linkedBrowser.messageManager;
   214   let deferred = Promise.defer();
   215   mm.addMessageListener(messageName, function onmessage(message) {
   216     mm.removeMessageListener(messageName, onmessage);
   217     deferred.resolve(message);
   218   });
   219   return deferred.promise;
   220 }
   222 function promiseNewTabLoadEvent(aUrl)
   223 {
   224   let tab = gBrowser.selectedTab = gBrowser.addTab(aUrl);
   225   let browser = tab.linkedBrowser;
   226   let mm = browser.messageManager;
   228   // give it an e10s-friendly content script to help with our tests.
   229   mm.loadFrameScript(CHROME_BASE + "content_aboutAccounts.js", true);
   230   // and wait for it to tell us about the load.
   231   return promiseOneMessage(tab, "test:document:load").then(
   232     () => tab
   233   );
   234 }
   236 // Returns a promise which is resolved with the iframe's URL after a new
   237 // tab is created and the iframe in that tab loads.
   238 function promiseNewTabWithIframeLoadEvent(aUrl) {
   239   let deferred = Promise.defer();
   240   let tab = gBrowser.selectedTab = gBrowser.addTab(aUrl);
   241   let browser = tab.linkedBrowser;
   242   let mm = browser.messageManager;
   244   // give it an e10s-friendly content script to help with our tests.
   245   mm.loadFrameScript(CHROME_BASE + "content_aboutAccounts.js", true);
   246   // and wait for it to tell us about the iframe load.
   247   mm.addMessageListener("test:iframe:load", function onFrameLoad(message) {
   248     mm.removeMessageListener("test:iframe:load", onFrameLoad);
   249     deferred.resolve([tab, message.data.url]);
   250   });
   251   return deferred.promise;
   252 }
   254 function checkVisibilities(tab, data) {
   255   let ids = Object.keys(data);
   256   let mm = tab.linkedBrowser.messageManager;
   257   let deferred = Promise.defer();
   258   mm.addMessageListener("test:check-visibilities-response", function onResponse(message) {
   259     mm.removeMessageListener("test:check-visibilities-response", onResponse);
   260     for (let id of ids) {
   261       is(message.data[id], data[id], "Element '" + id + "' has correct visibility");
   262     }
   263     deferred.resolve();
   264   });
   265   mm.sendAsyncMessage("test:check-visibilities", {ids: ids});
   266   return deferred.promise;
   267 }
   269 // watch out - these will fire observers which if you aren't careful, may
   270 // interfere with the tests.
   271 function setSignedInUser(data) {
   272   if (!data) {
   273     data = {
   274       email: "foo@example.com",
   275       uid: "1234@lcip.org",
   276       assertion: "foobar",
   277       sessionToken: "dead",
   278       kA: "beef",
   279       kB: "cafe",
   280       verified: true
   281     }
   282   }
   283  return fxAccounts.setSignedInUser(data);
   284 }
   286 function signOut() {
   287   return fxAccounts.signOut();
   288 }

mercurial