Bug 1364945 - Fix missing button to open options in a new tab in the Android addon details page.
MozReview-Commit-ID: Huqj8qn5LUV
--- a/mobile/android/components/extensions/test/mochitest/test_ext_options_ui.html
+++ b/mobile/android/components/extensions/test/mochitest/test_ext_options_ui.html
@@ -52,16 +52,20 @@ async function waitAddonOptionsPage([add
};
}
async function clickOnLinkInOptionsPage(selector) {
const optionsIframe = content.document.querySelector(`#addon-options`);
optionsIframe.contentDocument.querySelector(selector).click();
}
+async function clickAddonOptionButton() {
+ content.document.querySelector(`button#open-addon-options`).click();
+}
+
async function navigateBack() {
content.window.history.back();
}
function waitDOMContentLoaded(checkUrlCb) {
const {BrowserApp} = Services.wm.getMostRecentWindow("navigator:browser");
return new Promise(resolve => {
@@ -265,12 +269,116 @@ add_task(async function test_options_ui_
is(BrowserApp.selectedTab.currentURI.spec, "about:addons",
"about:addons is still the currently selected tab once the options has been loaded");
BrowserApp.closeTab(BrowserApp.selectedTab);
await extension.unload();
});
+add_task(async function test_options_ui_open_in_tab() {
+ let addonID = "test-options-ui@mozilla.org";
+
+ function background() {
+ browser.test.onMessage.addListener(msg => {
+ if (msg !== "runtime.openOptionsPage") {
+ browser.test.fail(`Received unexpected test message: ${msg}`);
+ return;
+ }
+
+ browser.runtime.openOptionsPage();
+ });
+ }
+
+ function optionsScript() {
+ browser.test.sendMessage("options-page-loaded", window.location.href);
+ }
+
+ let extension = ExtensionTestUtils.loadExtension({
+ useAddonManager: "temporary",
+ background,
+ manifest: {
+ applications: {
+ gecko: {id: addonID},
+ },
+ name: "Options UI open_in_tab Extension",
+ description: "Longer addon description",
+ options_ui: {
+ page: "options.html",
+ open_in_tab: true,
+ },
+ },
+ files: {
+ "options.js": optionsScript,
+ "options.html": `<!DOCTYPE html>
+ <html>
+ <head>
+ <meta charset="utf-8">
+ </head>
+ <body>
+ <h1>Options page</h1>
+ <script src="options.js"><\/script>
+ </body>
+ </html>
+ `,
+ },
+ });
+
+ await extension.startup();
+
+ const {BrowserApp} = Services.wm.getMostRecentWindow("navigator:browser");
+
+ let onceAboutAddonsLoaded = waitAboutAddonsLoaded();
+
+ BrowserApp.selectOrAddTab("about:addons", {
+ selected: true,
+ parentId: BrowserApp.selectedTab.id,
+ });
+
+ await onceAboutAddonsLoaded;
+
+ const aboutAddonsTab = BrowserApp.selectedTab;
+
+ is(aboutAddonsTab.currentURI.spec, "about:addons",
+ "about:addons is the currently selected tab");
+
+ await ContentTask.spawn(aboutAddonsTab.browser, addonID, waitAboutAddonsRendered);
+ await ContentTask.spawn(aboutAddonsTab.browser, addonID, navigateToAddonDetails);
+
+ let onceAddonOptionsLoaded = waitDOMContentLoaded(url => url.endsWith("options.html"));
+
+ info("Click the Options button in the addon details");
+ await ContentTask.spawn(aboutAddonsTab.browser, null, clickAddonOptionButton);
+
+ info("Waiting that the addon options are loaded in a new tab");
+ await onceAddonOptionsLoaded;
+
+ const addonOptionsTab = BrowserApp.selectedTab;
+
+ ok(aboutAddonsTab.id !== addonOptionsTab.id,
+ "The Addon Options page has been loaded in a new tab");
+
+ let optionsURL = await extension.awaitMessage("options-page-loaded");
+
+ is(addonOptionsTab.currentURI.spec, optionsURL,
+ "Got the expected extension url opened in the addon options tab");
+
+ BrowserApp.closeTab(addonOptionsTab);
+ BrowserApp.closeTab(aboutAddonsTab);
+
+ info("Wait runtime.openOptionsPage to open the options in a new tab");
+ onceAddonOptionsLoaded = waitDOMContentLoaded(url => url.endsWith("options.html"));
+ extension.sendMessage("runtime.openOptionsPage");
+ await onceAddonOptionsLoaded;
+
+ optionsURL = await extension.awaitMessage("options-page-loaded");
+ is(BrowserApp.selectedTab.currentURI.spec, optionsURL,
+ "runtime.openOptionsPage has opened the options in a new tab");
+
+ BrowserApp.closeTab(BrowserApp.selectedTab);
+
+ await extension.unload();
+});
+
</script>
</body>
</html>
--- a/mobile/android/locales/en-US/chrome/aboutAddons.properties
+++ b/mobile/android/locales/en-US/chrome/aboutAddons.properties
@@ -4,8 +4,10 @@
addonType.extension=Extension
addonType.theme=Theme
addonType.locale=Locale
addonStatus.uninstalled=%S will be uninstalled after restart.
addons.browseAll=Browse all Firefox Add-ons
+
+addon.options=Options
\ No newline at end of file
--- a/mobile/android/themes/core/aboutAddons.css
+++ b/mobile/android/themes/core/aboutAddons.css
@@ -334,8 +334,18 @@ div[opType="needs-disable"] .hide-on-dis
display: none;
}
#browse-title:dir(rtl) {
background-position: left;
background-image: url("chrome://browser/skin/images/chevron-rtl.png");
}
+/* open_in_tab options button style */
+
+button#open-addon-options {
+ font-size: 1em;
+ border: 1px solid var(--color_about_item_border);
+ background-color: var(--color_about_item);
+ width: 100%;
+ padding: 0.75em 0.5em;
+ border-radius: 0;
+}