Bug 1300995 - Part 2. Add a browser chrome test for form autofill popup footer. r=MattN draft
authorRay Lin <ralin@mozilla.com>
Tue, 13 Jun 2017 10:29:56 +0800
changeset 596011 707816684b15b208048cb950361adb7f93f3cb63
parent 596010 74af562563b61236f849ff56f083f84336d1006c
child 633844 92674736c87efc18d5dfc46176bbbe40e47fcfcf
push id64495
push userbmo:ralin@mozilla.com
push dateSat, 17 Jun 2017 10:15:19 +0000
reviewersMattN
bugs1300995
milestone56.0a1
Bug 1300995 - Part 2. Add a browser chrome test for form autofill popup footer. r=MattN MozReview-Commit-ID: 7IAp0SzPzmm
browser/extensions/formautofill/test/browser/browser.ini
browser/extensions/formautofill/test/browser/browser_autocomplete_footer.js
browser/extensions/formautofill/test/browser/browser_editProfileDialog.js
browser/extensions/formautofill/test/browser/browser_first_time_use_doorhanger.js
browser/extensions/formautofill/test/browser/browser_manageProfilesDialog.js
browser/extensions/formautofill/test/browser/head.js
--- a/browser/extensions/formautofill/test/browser/browser.ini
+++ b/browser/extensions/formautofill/test/browser/browser.ini
@@ -1,12 +1,13 @@
 [DEFAULT]
 head = head.js
 
 support-files =
   ../fixtures/autocomplete_basic.html
 
+[browser_autocomplete_footer.js]
 [browser_check_installed.js]
 [browser_editProfileDialog.js]
 [browser_first_time_use_doorhanger.js]
 [browser_privacyPreferences.js]
 [browser_manageProfilesDialog.js]
 [browser_submission_in_private_mode.js]
new file mode 100644
--- /dev/null
+++ b/browser/extensions/formautofill/test/browser/browser_autocomplete_footer.js
@@ -0,0 +1,60 @@
+"use strict";
+
+const URL = BASE_URL + "autocomplete_basic.html";
+const PRIVACY_PREF_URL = "about:preferences#privacy";
+
+add_task(async function setup_storage() {
+  await saveAddress(TEST_ADDRESS_1);
+  await saveAddress(TEST_ADDRESS_2);
+  await saveAddress(TEST_ADDRESS_3);
+});
+
+add_task(async function test_click_on_footer() {
+  await BrowserTestUtils.withNewTab({gBrowser, url: URL}, async function(browser) {
+    const {autoCompletePopup, autoCompletePopup: {richlistbox: itemsBox}} = browser;
+
+    await ContentTask.spawn(browser, {}, async function() {
+      content.document.getElementById("organization").focus();
+    });
+    await sleep(2000);
+    await BrowserTestUtils.synthesizeKey("VK_DOWN", {}, browser);
+    await expectPopupOpen(browser);
+
+    // Click on the footer
+    const listItemElems = itemsBox.querySelectorAll(".autocomplete-richlistitem");
+    const prefTabPromise = BrowserTestUtils.waitForNewTab(gBrowser, PRIVACY_PREF_URL);
+    await EventUtils.synthesizeMouseAtCenter(listItemElems[listItemElems.length - 1], {});
+    await BrowserTestUtils.removeTab(await prefTabPromise);
+    ok(true, "Tab: preferences#privacy was successfully opened by clicking on the footer");
+
+    // Ensure the popup is closed before entering the next test.
+    await ContentTask.spawn(browser, {}, async function() {
+      content.document.getElementById("organization").blur();
+    });
+    await BrowserTestUtils.waitForCondition(() => !autoCompletePopup.popupOpen);
+  });
+});
+
+add_task(async function test_press_enter_on_footer() {
+  await BrowserTestUtils.withNewTab({gBrowser, url: URL}, async function(browser) {
+    const {autoCompletePopup: {richlistbox: itemsBox}} = browser;
+
+    await ContentTask.spawn(browser, {}, async function() {
+      const input = content.document.getElementById("organization");
+      input.focus();
+    });
+    await sleep(2000);
+    await BrowserTestUtils.synthesizeKey("VK_DOWN", {}, browser);
+    await expectPopupOpen(browser);
+
+    // Navigate to the footer and press enter.
+    const listItemElems = itemsBox.querySelectorAll(".autocomplete-richlistitem");
+    const prefTabPromise = BrowserTestUtils.waitForNewTab(gBrowser, PRIVACY_PREF_URL);
+    for (let i = 0; i < listItemElems.length; i++) {
+      await BrowserTestUtils.synthesizeKey("VK_DOWN", {}, browser);
+    }
+    await BrowserTestUtils.synthesizeKey("VK_RETURN", {}, browser);
+    await BrowserTestUtils.removeTab(await prefTabPromise);
+    ok(true, "Tab: preferences#privacy was successfully opened by pressing enter on the footer");
+  });
+});
--- a/browser/extensions/formautofill/test/browser/browser_editProfileDialog.js
+++ b/browser/extensions/formautofill/test/browser/browser_editProfileDialog.js
@@ -1,17 +1,10 @@
 "use strict";
 
-registerCleanupFunction(async function() {
-  let addresses = await getAddresses();
-  if (addresses.length) {
-    await removeAddresses(addresses.map(address => address.guid));
-  }
-});
-
 add_task(async function test_cancelEditProfileDialog() {
   await new Promise(resolve => {
     let win = window.openDialog(EDIT_PROFILE_DIALOG_URL, null, null, null);
     win.addEventListener("load", () => {
       win.addEventListener("unload", () => {
         ok(true, "Edit profile dialog is closed");
         resolve();
       }, {once: true});
--- a/browser/extensions/formautofill/test/browser/browser_first_time_use_doorhanger.js
+++ b/browser/extensions/formautofill/test/browser/browser_first_time_use_doorhanger.js
@@ -1,21 +1,14 @@
 "use strict";
 
 const FORM_URL = "http://mochi.test:8888/browser/browser/extensions/formautofill/test/browser/autocomplete_basic.html";
 const FTU_PREF = "extensions.formautofill.firstTimeUse";
 const ENABLED_PREF = "extensions.formautofill.addresses.enabled";
 
-registerCleanupFunction(async function() {
-  let addresses = await getAddresses();
-  if (addresses.length) {
-    await removeAddresses(addresses.map(address => address.guid));
-  }
-});
-
 add_task(async function test_first_time_save() {
   let addresses = await getAddresses();
   is(addresses.length, 0, "No profile in storage");
   await SpecialPowers.pushPrefEnv({
     "set": [
       [FTU_PREF, true],
       [ENABLED_PREF, true],
     ],
--- a/browser/extensions/formautofill/test/browser/browser_manageProfilesDialog.js
+++ b/browser/extensions/formautofill/test/browser/browser_manageProfilesDialog.js
@@ -14,23 +14,16 @@ function waitForAddresses() {
     Services.cpmm.addMessageListener("FormAutofill:Addresses", function getResult(result) {
       Services.cpmm.removeMessageListener("FormAutofill:Addresses", getResult);
       // Wait for the next tick for elements to get rendered.
       SimpleTest.executeSoon(resolve.bind(null, result.data));
     });
   });
 }
 
-registerCleanupFunction(async function() {
-  let addresses = await getAddresses();
-  if (addresses.length) {
-    await removeAddresses(addresses.map(address => address.guid));
-  }
-});
-
 add_task(async function test_manageProfilesInitialState() {
   await BrowserTestUtils.withNewTab({gBrowser, url: MANAGE_PROFILES_DIALOG_URL}, async function(browser) {
     await ContentTask.spawn(browser, TEST_SELECTORS, (args) => {
       let selAddresses = content.document.querySelector(args.selAddresses);
       let btnRemove = content.document.querySelector(args.btnRemove);
       let btnEdit = content.document.querySelector(args.btnEdit);
       let btnAdd = content.document.querySelector(args.btnAdd);
 
--- a/browser/extensions/formautofill/test/browser/head.js
+++ b/browser/extensions/formautofill/test/browser/head.js
@@ -1,16 +1,17 @@
-/* exported MANAGE_PROFILES_DIALOG_URL, EDIT_PROFILE_DIALOG_URL,
+/* exported MANAGE_PROFILES_DIALOG_URL, EDIT_PROFILE_DIALOG_URL, BASE_URL,
             TEST_ADDRESS_1, TEST_ADDRESS_2, TEST_ADDRESS_3,
-            getAddresses, saveAddress, removeAddresses */
+            sleep, expectPopupOpen, getAddresses, saveAddress, removeAddresses */
 
 "use strict";
 
 const MANAGE_PROFILES_DIALOG_URL = "chrome://formautofill/content/manageProfiles.xhtml";
 const EDIT_PROFILE_DIALOG_URL = "chrome://formautofill/content/editProfile.xhtml";
+const BASE_URL = "http://mochi.test:8888/browser/browser/extensions/formautofill/test/browser/";
 
 const TEST_ADDRESS_1 = {
   "given-name": "John",
   "additional-name": "R.",
   "family-name": "Smith",
   organization: "World Wide Web Consortium",
   "street-address": "32 Vassar Street\nMIT Room 32-G524",
   "address-level2": "Cambridge",
@@ -26,16 +27,34 @@ const TEST_ADDRESS_2 = {
   country: "US",
 };
 
 const TEST_ADDRESS_3 = {
   "street-address": "Other Address",
   "postal-code": "12345",
 };
 
+async function sleep(ms = 500) {
+  await new Promise(resolve => setTimeout(resolve, ms));
+}
+
+async function expectPopupOpen(browser) {
+  const {autoCompletePopup, autoCompletePopup: {richlistbox: itemsBox}} = browser;
+  const listItemElems = itemsBox.querySelectorAll(".autocomplete-richlistitem");
+
+  await BrowserTestUtils.waitForCondition(() => autoCompletePopup.popupOpen);
+  await BrowserTestUtils.waitForCondition(() => {
+    return [...listItemElems].every(item => {
+      return (item.getAttribute("originaltype") == "autofill-profile" ||
+             item.getAttribute("originaltype") == "autofill-footer") &&
+             item.hasAttribute("formautofillattached");
+    });
+  });
+}
+
 function getAddresses() {
   return new Promise(resolve => {
     Services.cpmm.addMessageListener("FormAutofill:Addresses", function getResult(result) {
       Services.cpmm.removeMessageListener("FormAutofill:Addresses", getResult);
       resolve(result.data);
     });
     Services.cpmm.sendAsyncMessage("FormAutofill:GetAddresses", {});
   });
@@ -45,8 +64,15 @@ function saveAddress(address) {
   Services.cpmm.sendAsyncMessage("FormAutofill:SaveAddress", {address});
   return TestUtils.topicObserved("formautofill-storage-changed");
 }
 
 function removeAddresses(guids) {
   Services.cpmm.sendAsyncMessage("FormAutofill:RemoveAddresses", {guids});
   return TestUtils.topicObserved("formautofill-storage-changed");
 }
+
+registerCleanupFunction(async function() {
+  let addresses = await getAddresses();
+  if (addresses.length) {
+    await removeAddresses(addresses.map(address => address.guid));
+  }
+});