Bug 1337627: Load the discovery pane in a remote process.
This sets remote="true" on the browser element and moves most of the progress
listener logic that we use for detecting security errors into a frame script.
Detecting and handling the case where the remote process crashes is deferred to
bug 1344053. The handling of session history had to be re-worked slightly
because the history of inner remote browser no longer affects the global history
for the tab so we have to manually update it like for the fake history we use
in full windows.
MozReview-Commit-ID: FgmdNf7jPZR
--- a/browser/base/content/test/general/browser_bug590206.js
+++ b/browser/base/content/test/general/browser_bug590206.js
@@ -50,17 +50,17 @@ add_task(function* test_blank() {
is(getIdentityMode(), "unknownIdentity", "Identity should be unknown");
gBrowser.removeTab(newTab);
});
add_task(function* test_chrome() {
let oldTab = gBrowser.selectedTab;
- let newTab = yield loadNewTab("chrome://mozapps/content/extensions/extensions.xul");
+ let newTab = yield loadNewTab("chrome://browser/content/aboutDialog.xul");
is(getConnectionState(), "file", "Connection should be file");
gBrowser.selectedTab = oldTab;
is(getIdentityMode(), "unknownIdentity", "Identity should be unknown");
gBrowser.selectedTab = newTab;
is(getConnectionState(), "file", "Connection should be file");
--- a/browser/components/extensions/test/browser/browser_ext_sessions_getRecentlyClosed_tabs.js
+++ b/browser/components/extensions/test/browser/browser_ext_sessions_getRecentlyClosed_tabs.js
@@ -30,17 +30,17 @@ add_task(async function test_sessions_ge
let extension = ExtensionTestUtils.loadExtension({
manifest: {
permissions: ["sessions", "tabs"],
},
background,
});
let win = await BrowserTestUtils.openNewBrowserWindow();
- await BrowserTestUtils.loadURI(win.gBrowser.selectedBrowser, "about:addons");
+ await BrowserTestUtils.loadURI(win.gBrowser.selectedBrowser, "about:profiles");
await BrowserTestUtils.browserLoaded(win.gBrowser.selectedBrowser);
let expectedTabs = [];
let tab = win.gBrowser.selectedTab;
expectedTabs.push(expectedTabInfo(tab, win));
for (let url of ["about:robots", "about:mozilla"]) {
tab = await BrowserTestUtils.openNewForegroundTab(win.gBrowser, url);
expectedTabs.push(expectedTabInfo(tab, win));
new file mode 100644
--- /dev/null
+++ b/toolkit/mozapps/extensions/content/discovery-content.js
@@ -0,0 +1,103 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/* eslint-env mozilla/frame-script */
+
+const { interfaces: Ci, utils: Cu } = Components;
+
+Cu.import("resource://gre/modules/XPCOMUtils.jsm");
+Cu.import("resource://gre/modules/Services.jsm");
+
+let homepageURL = null;
+addMessageListener("Extensions:SetHomepage", (message) => {
+ homepageURL = Services.io.newURI(message.data);
+});
+
+const listener = {
+ onLocationChange(aWebProgress, aRequest, aLocation, aFlags) {
+ // Ignore the about:blank load
+ if (aLocation.spec == "about:blank")
+ return;
+
+ let state = {
+ view: "addons://discover/",
+ url: aLocation.spec
+ };
+
+ let replaceHistory = Ci.nsIWebNavigation.LOAD_FLAGS_REPLACE_HISTORY << 16;
+ if (docShell.loadType & replaceHistory)
+ sendAsyncMessage("Extensions:ReplaceState", state);
+ else
+ sendAsyncMessage("Extensions:PushState", state);
+
+ // If the hostname is the same as the new location's host and either the
+ // default scheme is insecure or the new location is secure then continue
+ // with the load
+ if (aLocation.host == homepageURL.host &&
+ (!homepageURL.schemeIs("https") || aLocation.schemeIs("https")))
+ return;
+
+ // Canceling the request will send an error to onStateChange which will show
+ // the error page
+ aRequest.cancel(Components.results.NS_BINDING_ABORTED);
+ },
+
+ onSecurityChange(aWebProgress, aRequest, aState) {
+ // Don't care about security if the page is not https
+ if (!homepageURL.schemeIs("https"))
+ return;
+
+ // If the request was secure then it is ok
+ if (aState & Ci.nsIWebProgressListener.STATE_IS_SECURE)
+ return;
+
+ // Canceling the request will send an error to onStateChange which will show
+ // the error page
+ aRequest.cancel(Components.results.NS_BINDING_ABORTED);
+ },
+
+ onStateChange(aWebProgress, aRequest, aStateFlags, aStatus) {
+ let transferStart = Ci.nsIWebProgressListener.STATE_IS_DOCUMENT |
+ Ci.nsIWebProgressListener.STATE_IS_REQUEST |
+ Ci.nsIWebProgressListener.STATE_TRANSFERRING;
+ // Once transferring begins show the content
+ if ((aStateFlags & transferStart) === transferStart)
+ sendAsyncMessage("Extensions:Transferring");
+
+ // Only care about the network events
+ if (!(aStateFlags & (Ci.nsIWebProgressListener.STATE_IS_NETWORK)))
+ return;
+
+ // If this is the start of network activity then show the loading page
+ if (aStateFlags & (Ci.nsIWebProgressListener.STATE_START))
+ sendAsyncMessage("Extensions:Loading");
+
+ // Ignore anything except stop events
+ if (!(aStateFlags & (Ci.nsIWebProgressListener.STATE_STOP)))
+ return;
+
+ // Consider the successful load of about:blank as still loading
+ if (aRequest instanceof Ci.nsIChannel && aRequest.URI.spec == "about:blank")
+ return;
+
+ // If there was an error loading the page or the new hostname is not the
+ // same as the default hostname or the default scheme is secure and the new
+ // scheme is insecure then show the error page
+ const NS_ERROR_PARSED_DATA_CACHED = 0x805D0021;
+ if (!(Components.isSuccessCode(aStatus) || aStatus == NS_ERROR_PARSED_DATA_CACHED) ||
+ (aRequest && aRequest instanceof Ci.nsIHttpChannel && !aRequest.requestSucceeded)) {
+ sendAsyncMessage("Extensions:Loaded", false);
+ } else {
+ sendAsyncMessage("Extensions:Loaded", true);
+ }
+ },
+
+ onProgressChange() { },
+ onStatusChange() { },
+
+ QueryInterface: XPCOMUtils.generateQI([Ci.nsIWebProgressListener,
+ Ci.nsISupportsWeakReference]),
+};
+
+docShell.QueryInterface(Ci.nsIWebProgress).addProgressListener(listener, Ci.nsIWebProgress.NOTIFY_ALL);
--- a/toolkit/mozapps/extensions/content/extensions.js
+++ b/toolkit/mozapps/extensions/content/extensions.js
@@ -2180,56 +2180,80 @@ var gDiscoverView = {
node: null,
enabled: true,
// Set to true after the view is first shown. If initialization completes
// after this then it must also load the discover homepage
loaded: false,
_browser: null,
_loading: null,
_error: null,
- homepageURL: null,
_loadListeners: [],
hideHeader: true,
initialize() {
this.enabled = isDiscoverEnabled();
if (!this.enabled) {
gCategories.get("addons://discover/").hidden = true;
return;
}
this.node = document.getElementById("discover-view");
this._loading = document.getElementById("discover-loading");
this._error = document.getElementById("discover-error");
this._browser = document.getElementById("discover-browser");
+ this.node.selectedPanel = this._loading;
+
+ // Instantiate the RemoteWebProgress instance (bug 1343382)
+ this._browser.webProgress;
+
+ this._browser.messageManager.loadFrameScript("chrome://mozapps/content/extensions/discovery-content.js", true);
+ this._browser.messageManager.addMessageListener("Extensions:ReplaceState", this);
+ this._browser.messageManager.addMessageListener("Extensions:PushState", this);
+ this._browser.messageManager.addMessageListener("Extensions:Loading", this);
+ this._browser.messageManager.addMessageListener("Extensions:Transferring", this);
+ this._browser.messageManager.addMessageListener("Extensions:Loaded", this);
+
+ // Wire up lightweight theme install messages
+ let ForwardingListener = function(message) {
+ // Forward any messages through this tab's message manager
+ let mm = window.QueryInterface(Ci.nsIInterfaceRequestor)
+ .getInterface(Ci.nsIDocShell)
+ .QueryInterface(Ci.nsIInterfaceRequestor)
+ .getInterface(Ci.nsIContentFrameMessageManager);
+ mm.sendAsyncMessage(message.name, message.data);
+ };
+ this._browser.messageManager.loadFrameScript("chrome://browser/content/content.js", true);
+ this._browser.messageManager.addMessageListener("LightWeightThemeWebInstaller:Install", ForwardingListener);
+ this._browser.messageManager.addMessageListener("LightWeightThemeWebInstaller:Preview", ForwardingListener);
+ this._browser.messageManager.addMessageListener("LightWeightThemeWebInstaller:ResetPreview", ForwardingListener);
+
let compatMode = "normal";
if (!AddonManager.checkCompatibility)
compatMode = "ignore";
else if (AddonManager.strictCompatibility)
compatMode = "strict";
var url = Services.prefs.getCharPref(PREF_DISCOVERURL);
url = url.replace("%COMPATIBILITY_MODE%", compatMode);
url = Services.urlFormatter.formatURL(url);
let setURL = (aURL) => {
try {
- this.homepageURL = Services.io.newURI(aURL);
+ let homepageURL = Services.io.newURI(aURL);
+ this._browser.messageManager.sendAsyncMessage("Extensions:SetHomepage", homepageURL.spec);
+ this._browser.homePage = homepageURL.spec;
} catch (e) {
this.showError();
notifyInitialized();
return;
}
- this._browser.homePage = this.homepageURL.spec;
- this._browser.addProgressListener(this);
-
if (this.loaded)
- this._loadURL(this.homepageURL.spec, false, notifyInitialized);
+ this._loadURL(this._browser.homePage, false, notifyInitialized);
else
notifyInitialized();
}
if (Services.prefs.getBoolPref(PREF_GETADDONS_CACHE_ENABLED) == false) {
setURL(url);
return;
}
@@ -2253,24 +2277,16 @@ var gDiscoverView = {
isBlocklisted: addon.blocklistState == Ci.nsIBlocklistService.STATE_BLOCKED
}
}
setURL(url + "#" + JSON.stringify(list));
});
},
- destroy() {
- try {
- this._browser.removeProgressListener(this);
- } catch (e) {
- // Ignore the case when the listener wasn't already registered
- }
- },
-
show(aParam, aRequest, aState, aIsRefresh) {
gViewController.updateCommands();
// If we're being told to load a specific URL then just do that
if (aState && "url" in aState) {
this.loaded = true;
this._loadURL(aState.url);
}
@@ -2283,22 +2299,22 @@ var gDiscoverView = {
gViewController.notifyViewChanged();
return;
}
this.loaded = true;
// No homepage means initialization isn't complete, the browser will get
// loaded once initialization is complete
- if (!this.homepageURL) {
+ if (!this._browser.homePage) {
this._loadListeners.push(gViewController.notifyViewChanged.bind(gViewController));
return;
}
- this._loadURL(this.homepageURL.spec, aIsRefresh,
+ this._loadURL(this._browser.homePage, aIsRefresh,
gViewController.notifyViewChanged.bind(gViewController));
},
canRefresh() {
if (this._browser.currentURI &&
this._browser.currentURI.spec == this._browser.homePage)
return false;
return true;
@@ -2316,128 +2332,64 @@ var gDiscoverView = {
_loadURL(aURL, aKeepHistory, aCallback) {
if (this._browser.currentURI.spec == aURL) {
if (aCallback)
aCallback();
return;
}
+ this.node.selectedPanel = this._loading;
+
if (aCallback)
this._loadListeners.push(aCallback);
var flags = 0;
if (!aKeepHistory)
flags |= Ci.nsIWebNavigation.LOAD_FLAGS_REPLACE_HISTORY;
this._browser.loadURIWithFlags(aURL, flags);
},
- onLocationChange(aWebProgress, aRequest, aLocation, aFlags) {
- // Ignore the about:blank load
- if (aLocation.spec == "about:blank")
- return;
-
- // When using the real session history the inner-frame will update the
- // session history automatically, if using the fake history though it must
- // be manually updated
- if (gHistory == FakeHistory) {
- var docshell = aWebProgress.QueryInterface(Ci.nsIDocShell);
-
- var state = {
- view: "addons://discover/",
- url: aLocation.spec
- };
-
- var replaceHistory = Ci.nsIWebNavigation.LOAD_FLAGS_REPLACE_HISTORY << 16;
- if (docshell.loadType & replaceHistory)
- gHistory.replaceState(state);
- else
- gHistory.pushState(state);
- gViewController.lastHistoryIndex = gHistory.index;
+ receiveMessage(aMessage) {
+ switch (aMessage.name) {
+ case "Extensions:ReplaceState":
+ gHistory.replaceState(aMessage.data);
+ gViewController.lastHistoryIndex = gHistory.index;
+ gViewController.updateCommands();
+ break;
+ case "Extensions:PushState":
+ gHistory.pushState(aMessage.data);
+ gViewController.lastHistoryIndex = gHistory.index;
+ gViewController.updateCommands();
+ break;
+ case "Extensions:Loading":
+ this.node.selectedPanel = this._loading;
+ break;
+ case "Extensions:Transferring":
+ this.node.selectedPanel = this._browser;
+ break;
+ case "Extensions:Loaded":
+ if (aMessage.data) {
+ // Got a successful load, make sure the browser is visible
+ this.node.selectedPanel = this._browser;
+ gViewController.updateCommands();
+ } else {
+ this.showError();
+ }
+
+ let listeners = this._loadListeners;
+ this._loadListeners = [];
+
+ for (let listener of listeners)
+ listener();
+ break;
}
-
- gViewController.updateCommands();
-
- // If the hostname is the same as the new location's host and either the
- // default scheme is insecure or the new location is secure then continue
- // with the load
- if (aLocation.host == this.homepageURL.host &&
- (!this.homepageURL.schemeIs("https") || aLocation.schemeIs("https")))
- return;
-
- // Canceling the request will send an error to onStateChange which will show
- // the error page
- aRequest.cancel(Components.results.NS_BINDING_ABORTED);
- },
-
- onSecurityChange(aWebProgress, aRequest, aState) {
- // Don't care about security if the page is not https
- if (!this.homepageURL.schemeIs("https"))
- return;
-
- // If the request was secure then it is ok
- if (aState & Ci.nsIWebProgressListener.STATE_IS_SECURE)
- return;
-
- // Canceling the request will send an error to onStateChange which will show
- // the error page
- aRequest.cancel(Components.results.NS_BINDING_ABORTED);
},
- onStateChange(aWebProgress, aRequest, aStateFlags, aStatus) {
- let transferStart = Ci.nsIWebProgressListener.STATE_IS_DOCUMENT |
- Ci.nsIWebProgressListener.STATE_IS_REQUEST |
- Ci.nsIWebProgressListener.STATE_TRANSFERRING;
- // Once transferring begins show the content
- if ((aStateFlags & transferStart) === transferStart)
- this.node.selectedPanel = this._browser;
-
- // Only care about the network events
- if (!(aStateFlags & (Ci.nsIWebProgressListener.STATE_IS_NETWORK)))
- return;
-
- // If this is the start of network activity then show the loading page
- if (aStateFlags & (Ci.nsIWebProgressListener.STATE_START))
- this.node.selectedPanel = this._loading;
-
- // Ignore anything except stop events
- if (!(aStateFlags & (Ci.nsIWebProgressListener.STATE_STOP)))
- return;
-
- // Consider the successful load of about:blank as still loading
- if (aRequest instanceof Ci.nsIChannel && aRequest.URI.spec == "about:blank")
- return;
-
- // If there was an error loading the page or the new hostname is not the
- // same as the default hostname or the default scheme is secure and the new
- // scheme is insecure then show the error page
- const NS_ERROR_PARSED_DATA_CACHED = 0x805D0021;
- if (!(Components.isSuccessCode(aStatus) || aStatus == NS_ERROR_PARSED_DATA_CACHED) ||
- (aRequest && aRequest instanceof Ci.nsIHttpChannel && !aRequest.requestSucceeded)) {
- this.showError();
- } else {
- // Got a successful load, make sure the browser is visible
- this.node.selectedPanel = this._browser;
- gViewController.updateCommands();
- }
-
- var listeners = this._loadListeners;
- this._loadListeners = [];
-
- for (let listener of listeners)
- listener();
- },
-
- onProgressChange() { },
- onStatusChange() { },
-
- QueryInterface: XPCOMUtils.generateQI([Ci.nsIWebProgressListener,
- Ci.nsISupportsWeakReference]),
-
getSelectedAddon() {
return null;
}
};
var gCachedAddons = {};
--- a/toolkit/mozapps/extensions/content/extensions.xul
+++ b/toolkit/mozapps/extensions/content/extensions.xul
@@ -183,17 +183,17 @@
<description class="discover-description">&discover.description2;</description>
<description class="discover-footer">&discover.footer;</description>
</vbox>
</hbox>
<spacer class="discover-spacer-after"/>
</hbox>
<spacer class="alert-spacer-after"/>
</vbox>
- <browser id="discover-browser" type="content" flex="1"
+ <browser id="discover-browser" type="content" flex="1" remote="true"
disablehistory="true" homepage="about:blank"/>
</deck>
<!-- container for views with the search/tools header -->
<vbox id="headered-views" flex="1">
<!-- main header -->
<hbox id="header" align="center">
<button id="show-all-extensions" hidden="true"
--- a/toolkit/mozapps/extensions/jar.mn
+++ b/toolkit/mozapps/extensions/jar.mn
@@ -22,14 +22,15 @@ toolkit.jar:
content/mozapps/extensions/update.js (content/update.js)
content/mozapps/extensions/eula.xul (content/eula.xul)
content/mozapps/extensions/eula.js (content/eula.js)
content/mozapps/extensions/newaddon.xul (content/newaddon.xul)
content/mozapps/extensions/newaddon.js (content/newaddon.js)
content/mozapps/extensions/pluginPrefs.xul (content/pluginPrefs.xul)
content/mozapps/extensions/gmpPrefs.xul (content/gmpPrefs.xul)
content/mozapps/extensions/OpenH264-license.txt (content/OpenH264-license.txt)
+ content/mozapps/extensions/discovery-content.js (content/discovery-content.js)
#endif
content/mozapps/extensions/setting.xml (content/setting.xml)
content/mozapps/xpinstall/xpinstallConfirm.xul (content/xpinstallConfirm.xul)
content/mozapps/xpinstall/xpinstallConfirm.js (content/xpinstallConfirm.js)
content/mozapps/xpinstall/xpinstallConfirm.css (content/xpinstallConfirm.css)
content/mozapps/xpinstall/xpinstallItem.xml (content/xpinstallItem.xml)
--- a/toolkit/mozapps/extensions/test/browser/browser_bug562797.js
+++ b/toolkit/mozapps/extensions/test/browser/browser_bug562797.js
@@ -4,56 +4,35 @@
/**
* Tests that history navigation works for the add-ons manager.
*/
const MAIN_URL = "https://example.com/" + RELATIVE_DIR + "discovery.html";
const SECOND_URL = "https://example.com/" + RELATIVE_DIR + "releaseNotes.xhtml";
-var gLoadCompleteCallback = null;
-
-var gProgressListener = {
- onStateChange(aWebProgress, aRequest, aStateFlags, aStatus) {
- // Only care about the network stop status events
- if (!(aStateFlags & (Ci.nsIWebProgressListener.STATE_IS_NETWORK)) ||
- !(aStateFlags & (Ci.nsIWebProgressListener.STATE_STOP)))
- return;
-
- if (gLoadCompleteCallback)
- executeSoon(gLoadCompleteCallback);
- gLoadCompleteCallback = null;
- },
-
- onLocationChange() { },
- onSecurityChange() { },
- onProgressChange() { },
- onStatusChange() { },
-
- QueryInterface: XPCOMUtils.generateQI([Ci.nsIWebProgressListener,
- Ci.nsISupportsWeakReference]),
-};
-
function waitForLoad(aManager, aCallback) {
var browser = aManager.document.getElementById("discover-browser");
- browser.addProgressListener(gProgressListener);
- gLoadCompleteCallback = function() {
- browser.removeProgressListener(gProgressListener);
+ let listener = function() {
+ browser.messageManager.removeMessageListener("Extensions:Loaded", listener);
aCallback();
- };
+ }
+ browser.messageManager.addMessageListener("Extensions:Loaded", listener);
}
function clickLink(aManager, aId, aCallback) {
waitForLoad(aManager, aCallback);
var browser = aManager.document.getElementById("discover-browser");
- var link = browser.contentDocument.getElementById(aId);
- EventUtils.sendMouseEvent({type: "click"}, link);
+ ContentTask.spawn(browser, aId, function* (id) {
+ let element = content.document.getElementById(id);
+ element.click();
+ });
}
function test() {
requestLongerTimeout(2);
waitForExplicitFinish();
Services.prefs.setCharPref(PREF_DISCOVERURL, MAIN_URL);
@@ -903,17 +882,17 @@ add_test(function() {
}
close_manager(aManager, run_next_test);
});
});
}, true);
});
-// Tests that refreshing the disicovery pane integrates properly with history
+// Tests that refreshing the discovery pane integrates properly with history
add_test(function() {
open_manager("addons://list/plugin", function(aManager) {
is_in_list(aManager, "addons://list/plugin", false, false);
EventUtils.synthesizeMouseAtCenter(aManager.document.getElementById("category-discover"), { }, aManager);
wait_for_view_load(aManager, function(aManager) {
is_in_discovery(aManager, MAIN_URL, true, false);
--- a/toolkit/mozapps/extensions/test/browser/browser_discovery.js
+++ b/toolkit/mozapps/extensions/test/browser/browser_discovery.js
@@ -5,39 +5,16 @@
// Tests that the discovery view loads properly
const MAIN_URL = "https://example.com/" + RELATIVE_DIR + "discovery.html";
var gManagerWindow;
var gCategoryUtilities;
var gProvider;
-var gLoadCompleteCallback = null;
-
-var gProgressListener = {
- onStateChange(aWebProgress, aRequest, aStateFlags, aStatus) {
- // Only care about the network stop status events
- if (!(aStateFlags & (Ci.nsIWebProgressListener.STATE_IS_NETWORK)) ||
- !(aStateFlags & (Ci.nsIWebProgressListener.STATE_STOP)))
- return;
-
- if (gLoadCompleteCallback)
- executeSoon(gLoadCompleteCallback);
- gLoadCompleteCallback = null;
- },
-
- onLocationChange() { },
- onSecurityChange() { },
- onProgressChange() { },
- onStatusChange() { },
-
- QueryInterface: XPCOMUtils.generateQI([Ci.nsIWebProgressListener,
- Ci.nsISupportsWeakReference]),
-};
-
function test() {
// Switch to a known url
Services.prefs.setCharPref(PREF_DISCOVERURL, MAIN_URL);
// Temporarily enable caching
Services.prefs.setBoolPref(PREF_GETADDONS_CACHE_ENABLED, true);
waitForExplicitFinish();
@@ -162,28 +139,32 @@ function isLoading() {
function isError() {
return gManagerWindow.document.getElementById("discover-view").selectedPanel ==
gManagerWindow.document.getElementById("discover-error");
}
function clickLink(aId, aCallback) {
var browser = gManagerWindow.document.getElementById("discover-browser");
- browser.addProgressListener(gProgressListener);
+
+ let loadingListener = function(message) {
+ browser.messageManager.removeMessageListener("Extensions:Loading", loadingListener);
+ ok(isLoading(), "Clicking a link should show the loading pane");
- gLoadCompleteCallback = function() {
- browser.removeProgressListener(gProgressListener);
- aCallback();
- };
+ let loadedListener = function(message) {
+ browser.messageManager.removeMessageListener("Extensions:Loaded", loadedListener);
+ executeSoon(aCallback);
+ }
+ browser.messageManager.addMessageListener("Extensions:Loaded", loadedListener);
+ }
+ browser.messageManager.addMessageListener("Extensions:Loading", loadingListener);
- var link = browser.contentDocument.getElementById(aId);
- EventUtils.sendMouseEvent({type: "click"}, link);
-
- executeSoon(function() {
- ok(isLoading(), "Clicking a link should show the loading pane");
+ ContentTask.spawn(browser, aId, function* (aId) {
+ let element = content.document.getElementById(aId);
+ element.click();
});
}
// Tests that switching to the discovery view displays the right url
add_test(function() {
open_manager("addons://list/extension", function(aWindow) {
gManagerWindow = aWindow;
gCategoryUtilities = new CategoryUtilities(gManagerWindow);
--- a/toolkit/mozapps/extensions/test/browser/browser_discovery_install.js
+++ b/toolkit/mozapps/extensions/test/browser/browser_discovery_install.js
@@ -21,19 +21,29 @@ Services.perms.add(NetUtil.newURI("https
Ci.nsIPermissionManager.ALLOW_ACTION);
registerCleanupFunction(() => {
Services.perms.remove(NetUtil.newURI("https://example.com/"), "install");
Services.perms.remove(NetUtil.newURI("https://example.org/"), "install");
Services.prefs.clearUserPref(PREF_INSTALL_REQUIREBUILTINCERTS);
});
-function clickLink(frameLoader, id) {
- let link = frameLoader.contentDocument.getElementById(id);
- EventUtils.sendMouseEvent({type: "click"}, link);
+function clickLink(browser, id) {
+ ContentTask.spawn(browser, id, function* (id) {
+ let element = content.document.getElementById(id);
+ element.click();
+ });
+}
+
+function clickLinkInFrame(browser, id) {
+ ContentTask.spawn(browser, id, function* (id) {
+ let frame = content.document.getElementById("frame");
+ let element = frame.contentDocument.getElementById(id);
+ element.click();
+ });
}
function waitForInstall() {
return new Promise(resolve => {
wait_for_window_open((window) => {
is(window.location, "chrome://mozapps/content/xpinstall/xpinstallConfirm.xul",
"Should have seen the install window");
window.document.documentElement.cancelDialog();
@@ -79,55 +89,51 @@ add_task(function* test_install_js() {
});
// Installing from an inner-frame of the same origin should work
add_task(function* test_install_inner_direct() {
Services.prefs.setCharPref(PREF_DISCOVERURL, GOOD_FRAMED_URL);
let managerWindow = yield open_manager("addons://discover/");
let browser = managerWindow.document.getElementById("discover-browser");
- let frame = browser.contentDocument.getElementById("frame");
- clickLink(frame, "install-direct");
+ clickLinkInFrame(browser, "install-direct");
yield waitForInstall();
yield close_manager(managerWindow);
});
add_task(function* test_install_inner_js() {
Services.prefs.setCharPref(PREF_DISCOVERURL, GOOD_FRAMED_URL);
let managerWindow = yield open_manager("addons://discover/");
let browser = managerWindow.document.getElementById("discover-browser");
- let frame = browser.contentDocument.getElementById("frame");
- clickLink(frame, "install-js");
+ clickLinkInFrame(browser, "install-js");
yield waitForInstall();
yield close_manager(managerWindow);
});
// Installing from an inner-frame of a different origin should fail
add_task(function* test_install_xorigin_direct() {
Services.prefs.setCharPref(PREF_DISCOVERURL, BAD_FRAMED_URL);
let managerWindow = yield open_manager("addons://discover/");
let browser = managerWindow.document.getElementById("discover-browser");
- let frame = browser.contentDocument.getElementById("frame");
- clickLink(frame, "install-direct");
+ clickLinkInFrame(browser, "install-direct");
yield waitForFail();
yield close_manager(managerWindow);
});
add_task(function* test_install_xorigin_js() {
Services.prefs.setCharPref(PREF_DISCOVERURL, BAD_FRAMED_URL);
let managerWindow = yield open_manager("addons://discover/");
let browser = managerWindow.document.getElementById("discover-browser");
- let frame = browser.contentDocument.getElementById("frame");
- clickLink(frame, "install-js");
+ clickLinkInFrame(browser, "install-js");
yield waitForFail();
yield close_manager(managerWindow);
});