From 6bf0a5cb5034a7e684dcc3500e841785237ce2dd Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sun, 7 Apr 2024 19:32:43 +0200 Subject: Adding upstream version 1:115.7.0. Signed-off-by: Daniel Baumann --- .../content/test/sync/browser_fxa_web_channel.js | 282 +++++++++++++++++++++ 1 file changed, 282 insertions(+) create mode 100644 browser/base/content/test/sync/browser_fxa_web_channel.js (limited to 'browser/base/content/test/sync/browser_fxa_web_channel.js') diff --git a/browser/base/content/test/sync/browser_fxa_web_channel.js b/browser/base/content/test/sync/browser_fxa_web_channel.js new file mode 100644 index 0000000000..903dd317ac --- /dev/null +++ b/browser/base/content/test/sync/browser_fxa_web_channel.js @@ -0,0 +1,282 @@ +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ + */ + +XPCOMUtils.defineLazyGetter(this, "FxAccountsCommon", function () { + return ChromeUtils.import("resource://gre/modules/FxAccountsCommon.js"); +}); + +ChromeUtils.defineESModuleGetters(this, { + WebChannel: "resource://gre/modules/WebChannel.sys.mjs", +}); + +var { FxAccountsWebChannel } = ChromeUtils.importESModule( + "resource://gre/modules/FxAccountsWebChannel.sys.mjs" +); + +// eslint-disable-next-line @microsoft/sdl/no-insecure-url +const TEST_HTTP_PATH = "http://example.com"; +const TEST_BASE_URL = + TEST_HTTP_PATH + + "/browser/browser/base/content/test/sync/browser_fxa_web_channel.html"; +const TEST_CHANNEL_ID = "account_updates_test"; + +var gTests = [ + { + desc: "FxA Web Channel - should receive message about profile changes", + async run() { + let client = new FxAccountsWebChannel({ + content_uri: TEST_HTTP_PATH, + channel_id: TEST_CHANNEL_ID, + }); + let promiseObserver = new Promise((resolve, reject) => { + makeObserver( + FxAccountsCommon.ON_PROFILE_CHANGE_NOTIFICATION, + function (subject, topic, data) { + Assert.equal(data, "abc123"); + client.tearDown(); + resolve(); + } + ); + }); + + await BrowserTestUtils.withNewTab( + { + gBrowser, + url: TEST_BASE_URL + "?profile_change", + }, + async function () { + await promiseObserver; + } + ); + }, + }, + { + desc: "fxa web channel - login messages should notify the fxAccounts object", + async run() { + let promiseLogin = new Promise((resolve, reject) => { + let login = accountData => { + Assert.equal(typeof accountData.authAt, "number"); + Assert.equal(accountData.email, "testuser@testuser.com"); + Assert.equal(accountData.keyFetchToken, "key_fetch_token"); + Assert.equal(accountData.sessionToken, "session_token"); + Assert.equal(accountData.uid, "uid"); + Assert.equal(accountData.unwrapBKey, "unwrap_b_key"); + Assert.equal(accountData.verified, true); + + client.tearDown(); + resolve(); + }; + + let client = new FxAccountsWebChannel({ + content_uri: TEST_HTTP_PATH, + channel_id: TEST_CHANNEL_ID, + helpers: { + login, + }, + }); + }); + + await BrowserTestUtils.withNewTab( + { + gBrowser, + url: TEST_BASE_URL + "?login", + }, + async function () { + await promiseLogin; + } + ); + }, + }, + { + desc: "fxa web channel - can_link_account messages should respond", + async run() { + let properUrl = TEST_BASE_URL + "?can_link_account"; + + let promiseEcho = new Promise((resolve, reject) => { + let webChannelOrigin = Services.io.newURI(properUrl); + // responses sent to content are echoed back over the + // `fxaccounts_webchannel_response_echo` channel. Ensure the + // fxaccounts:can_link_account message is responded to. + let echoWebChannel = new WebChannel( + "fxaccounts_webchannel_response_echo", + webChannelOrigin + ); + echoWebChannel.listen((webChannelId, message, target) => { + Assert.equal(message.command, "fxaccounts:can_link_account"); + Assert.equal(message.messageId, 2); + Assert.equal(message.data.ok, true); + + client.tearDown(); + echoWebChannel.stopListening(); + + resolve(); + }); + + let client = new FxAccountsWebChannel({ + content_uri: TEST_HTTP_PATH, + channel_id: TEST_CHANNEL_ID, + helpers: { + shouldAllowRelink(acctName) { + return acctName === "testuser@testuser.com"; + }, + }, + }); + }); + + await BrowserTestUtils.withNewTab( + { + gBrowser, + url: properUrl, + }, + async function () { + await promiseEcho; + } + ); + }, + }, + { + desc: "fxa web channel - logout messages should notify the fxAccounts object", + async run() { + let promiseLogout = new Promise((resolve, reject) => { + let logout = uid => { + Assert.equal(uid, "uid"); + + client.tearDown(); + resolve(); + }; + + let client = new FxAccountsWebChannel({ + content_uri: TEST_HTTP_PATH, + channel_id: TEST_CHANNEL_ID, + helpers: { + logout, + }, + }); + }); + + await BrowserTestUtils.withNewTab( + { + gBrowser, + url: TEST_BASE_URL + "?logout", + }, + async function () { + await promiseLogout; + } + ); + }, + }, + { + desc: "fxa web channel - delete messages should notify the fxAccounts object", + async run() { + let promiseDelete = new Promise((resolve, reject) => { + let logout = uid => { + Assert.equal(uid, "uid"); + + client.tearDown(); + resolve(); + }; + + let client = new FxAccountsWebChannel({ + content_uri: TEST_HTTP_PATH, + channel_id: TEST_CHANNEL_ID, + helpers: { + logout, + }, + }); + }); + + await BrowserTestUtils.withNewTab( + { + gBrowser, + url: TEST_BASE_URL + "?delete", + }, + async function () { + await promiseDelete; + } + ); + }, + }, + { + desc: "fxa web channel - firefox_view messages should call the openFirefoxView helper", + async run() { + let wasCalled = false; + let promiseMessageHandled = new Promise((resolve, reject) => { + let openFirefoxView = (browser, entryPoint) => { + wasCalled = true; + Assert.ok( + !!browser.ownerGlobal, + "openFirefoxView called with a browser argument" + ); + Assert.equal( + typeof browser.ownerGlobal.FirefoxViewHandler.openTab, + "function", + "We can reach the openTab method" + ); + + client.tearDown(); + resolve(); + }; + + let client = new FxAccountsWebChannel({ + content_uri: TEST_HTTP_PATH, + channel_id: TEST_CHANNEL_ID, + helpers: { + openFirefoxView, + }, + }); + }); + + await BrowserTestUtils.withNewTab( + { + gBrowser, + url: TEST_BASE_URL + "?firefox_view", + }, + async function () { + await promiseMessageHandled; + } + ); + Assert.ok(wasCalled, "openFirefoxView did get called"); + }, + }, +]; // gTests + +function makeObserver(aObserveTopic, aObserveFunc) { + let callback = function (aSubject, aTopic, aData) { + if (aTopic == aObserveTopic) { + removeMe(); + aObserveFunc(aSubject, aTopic, aData); + } + }; + + function removeMe() { + Services.obs.removeObserver(callback, aObserveTopic); + } + + Services.obs.addObserver(callback, aObserveTopic); + return removeMe; +} + +registerCleanupFunction(function () { + Services.prefs.clearUserPref( + "browser.tabs.remote.separatePrivilegedMozillaWebContentProcess" + ); +}); + +function test() { + waitForExplicitFinish(); + Services.prefs.setBoolPref( + "browser.tabs.remote.separatePrivilegedMozillaWebContentProcess", + false + ); + + (async function () { + for (let testCase of gTests) { + info("Running: " + testCase.desc); + await testCase.run(); + } + })().then(finish, ex => { + Assert.ok(false, "Unexpected Exception: " + ex); + finish(); + }); +} -- cgit v1.2.3