Bug 1364945 - Fix missing button to open options in a new tab in the Android addon details page. draft
authorLuca Greco <lgreco@mozilla.com>
Thu, 17 Aug 2017 20:14:57 +0200
changeset 650524 46343e52f208091316835c080244b8942499b722
parent 650523 808314897955796c527851a50ec20bf010580d9c
child 650526 27c3d80d618b155ab0da0209fb304f2924ba1684
push id75434
push userluca.greco@alcacoop.it
push dateTue, 22 Aug 2017 15:46:25 +0000
bugs1364945
milestone57.0a1
Bug 1364945 - Fix missing button to open options in a new tab in the Android addon details page. MozReview-Commit-ID: Huqj8qn5LUV
mobile/android/components/extensions/test/mochitest/test_ext_options_ui.html
mobile/android/locales/en-US/chrome/aboutAddons.properties
mobile/android/themes/core/aboutAddons.css
--- 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;
+}