Bug 1351638 - Fix intermittents caused by menus_commands test draft
authorTomislav Jovanovic <tomica@gmail.com>
Tue, 04 Jul 2017 03:12:34 +0200
changeset 603938 187d3e5cdd571d880ed46223ecdaf83d705c0af2
parent 600103 d85a801d244f0a39e34f6e1c723af19dde728867
child 636043 7ee41496e127bba73eeb11b3d2cbeb4b485c6537
push id66908
push userbmo:tomica@gmail.com
push dateWed, 05 Jul 2017 01:57:56 +0000
bugs1351638
milestone56.0a1
Bug 1351638 - Fix intermittents caused by menus_commands test MozReview-Commit-ID: FsU2MHL0c9o
browser/components/extensions/test/browser/browser-common.ini
browser/components/extensions/test/browser/browser_ext_contextMenus_commands.js
browser/components/extensions/test/browser/browser_ext_contextMenus_icons.js
browser/components/extensions/test/browser/browser_ext_contextMenus_onclick.js
browser/components/extensions/test/browser/head.js
--- a/browser/components/extensions/test/browser/browser-common.ini
+++ b/browser/components/extensions/test/browser/browser-common.ini
@@ -50,17 +50,16 @@ skip-if = (os == 'win' && !debug) # bug 
 [browser_ext_commands_execute_sidebar_action.js]
 [browser_ext_commands_getAll.js]
 [browser_ext_commands_onCommand.js]
 [browser_ext_contentscript_connect.js]
 [browser_ext_contextMenus.js]
 [browser_ext_contextMenus_checkboxes.js]
 [browser_ext_contextMenus_commands.js]
 [browser_ext_contextMenus_icons.js]
-skip-if = os == 'win' && !debug # Bug 1351638
 [browser_ext_contextMenus_onclick.js]
 [browser_ext_contextMenus_radioGroups.js]
 [browser_ext_contextMenus_uninstall.js]
 [browser_ext_contextMenus_urlPatterns.js]
 [browser_ext_currentWindow.js]
 [browser_ext_devtools_inspectedWindow.js]
 [browser_ext_devtools_inspectedWindow_eval_bindings.js]
 [browser_ext_devtools_inspectedWindow_reload.js]
--- a/browser/components/extensions/test/browser/browser_ext_contextMenus_commands.js
+++ b/browser/components/extensions/test/browser/browser_ext_contextMenus_commands.js
@@ -28,16 +28,17 @@ add_task(async function() {
   function testScript() {
     window.onload = () => {
       browser.test.sendMessage("test-opened", true);
     };
   }
 
   let extension = ExtensionTestUtils.loadExtension({
     manifest: {
+      "name": "contextMenus commands",
       "permissions": ["contextMenus", "activeTab", "tabs"],
       "browser_action": {
         "default_title": "Test BrowserAction",
         "default_popup": "test.html",
         "browser_style": true,
       },
       "page_action": {
         "default_title": "Test PageAction",
@@ -54,16 +55,17 @@ add_task(async function() {
       "test.html": `<!DOCTYPE html><meta charset="utf-8"><script src="test.js"></script>`,
       "test.js": testScript,
     },
   });
 
   async function testContext(id) {
     const menu = await openExtensionContextMenu();
     const items = menu.getElementsByAttribute("label", id);
+    is(items.length, 1, `exactly one menu item found`);
     await closeExtensionContextMenu(items[0]);
     return extension.awaitMessage("test-opened");
   }
 
   await extension.startup();
   await extension.awaitMessage("ready");
 
   // open a page so page action works
--- a/browser/components/extensions/test/browser/browser_ext_contextMenus_icons.js
+++ b/browser/components/extensions/test/browser/browser_ext_contextMenus_icons.js
@@ -6,16 +6,17 @@ add_task(async function() {
   let tab1 = await BrowserTestUtils.openNewForegroundTab(gBrowser,
     "http://mochi.test:8888/browser/browser/components/extensions/test/browser/context.html?test=icons");
 
   let encodedImageData = "iVBORw0KGgoAAAANSUhEUgAAACQAAAAkCAYAAADhAJiYAAAC4klEQVRYhdWXLWzbQBSADQtDAwsHC1tUhUxqfL67lk2tdn+OJg0ODU0rLByqgqINBY6tmlbn7LMTJ5FaFVVBk1G0oUGjG2jT2Y7jxmmcbU/6iJ+f36fz+e5sGP9riCGm9hB37RG+scd4Yo/wsDXCZyIE2xuXsce4bY+wXkAsQtzYmExrfFgvkJkRbkzo1ehoxx5iXcgI/9iYUGt8WH9MqDXEcmNChmEYrRCf2SHWeYgQx3x0tLNRIeKQLTtEFyJEep4NTuhk8BC+yMrwEE3+iozo42d8gK7FAOkMsRiiN8QhW2ttSK5QTfRRV4QoymVeJMvPvDp7gCZigD613MN6yRFA3SWarow9QB9LCfG+NeF9qCtjAKOSQjCqVKhfVsiHEQ+grgx/lRGqUihAc1uL8EFD+KCRO+GrF4J61phcoRoPoEzkYhZYpykh5sMb7kOdIeY+jHKur4QI4Feh4AFX1nVeLxrAvQchGsBz5ls6wa2QdwcvIcE2863bTH79KOvsz/uUYJsp+J0pSzNlDckVqqVGUAF+n6uS7txcOl6wot4JVy70ufDLy4pWLUQVPE81pRI0mGe9oxLMHSeohHvMs/STUNaUK6vDPCvOyxMFDx4achehRDJmHnydnkPww5OFfLxrGIZBFDyYl4LpMzlTQFIP6AQx86w2UeYBccFpJrcKv5L9eGDtUAU6RIELqsB74uynjy/UBRF1gS5BTFxwQT1wTiXoUg9MH7m/3NZRRoi5IJytUbMgzv4Wc832+oQkiKgEehmyMkkpKsFkQV11QsRJL5rJYBLItQgRaUZEmnoZXsomz3vGiWw+I9KMF9SVFOqZEemZekli1jN3U/UOqhHHvC6oWWGElhfSpGdOk6+O9prdwvtLj5BjRsQxdRnot+Zeifpy/2/0stktKTRNLmbk0mwXyl8253fyojj+8rxOHNAhjjm5n0/5OOCGOKBzkrMO0Z75lvSAzKlrF32Z/3z8BqLAn+yMV7VhAAAAAElFTkSuQmCC";
   const IMAGE_ARRAYBUFFER = imageBufferFromDataURI(encodedImageData);
 
   let extension = ExtensionTestUtils.loadExtension({
     manifest: {
+      "name": "contextMenus icons",
       "permissions": ["contextMenus"],
       "icons": {
         "18": "extension.png",
       },
     },
 
     files: {
       "extension.png": IMAGE_ARRAYBUFFER,
@@ -33,38 +34,40 @@ add_task(async function() {
       browser.contextMenus.create({
         title: "child",
       });
 
       browser.test.notifyPass("contextmenus-icons");
     },
   });
 
-  let confirmContextMenuIcon = (rootElement) => {
+  let confirmContextMenuIcon = (rootElements) => {
     let expectedURL = new RegExp(String.raw`^moz-extension://[^/]+/extension\.png$`);
-    let imageUrl = rootElement.getAttribute("image");
+    is(rootElements.length, 1, "Found exactly one menu item");
+    let imageUrl = rootElements[0].getAttribute("image");
     ok(expectedURL.test(imageUrl), "The context menu should display the extension icon next to the root element");
   };
 
   await extension.startup();
   await extension.awaitFinish("contextmenus-icons");
 
   let extensionMenu = await openExtensionContextMenu();
 
   let contextMenu = document.getElementById("contentAreaContextMenu");
-  let topLevelMenuItem = contextMenu.getElementsByAttribute("ext-type", "top-level-menu")[0];
+  let topLevelMenuItem = contextMenu.getElementsByAttribute("ext-type", "top-level-menu");
   confirmContextMenuIcon(topLevelMenuItem);
 
-  let childToDelete = extensionMenu.getElementsByAttribute("label", "child-to-delete")[0];
-  await closeExtensionContextMenu(childToDelete);
+  let childToDelete = extensionMenu.getElementsByAttribute("label", "child-to-delete");
+  is(childToDelete.length, 1, "Found exactly one child to delete");
+  await closeExtensionContextMenu(childToDelete[0]);
   await extension.awaitMessage("child-deleted");
 
   await openExtensionContextMenu();
 
   contextMenu = document.getElementById("contentAreaContextMenu");
-  topLevelMenuItem = contextMenu.getElementsByAttribute("label", "child")[0];
+  topLevelMenuItem = contextMenu.getElementsByAttribute("label", "child");
 
   confirmContextMenuIcon(topLevelMenuItem);
   await closeContextMenu();
 
   await extension.unload();
   await BrowserTestUtils.removeTab(tab1);
 });
--- a/browser/components/extensions/test/browser/browser_ext_contextMenus_onclick.js
+++ b/browser/components/extensions/test/browser/browser_ext_contextMenus_onclick.js
@@ -213,16 +213,17 @@ add_task(async function test_onclick_mod
   const tab = await BrowserTestUtils.openNewForegroundTab(gBrowser, PAGE);
 
   await extension.startup();
   await extension.awaitMessage("ready");
 
   async function click(modifiers = {}) {
     const menu = await openContextMenu();
     const items = menu.getElementsByAttribute("label", "modify");
+    is(items.length, 1, "Got exactly one context menu item");
     await closeExtensionContextMenu(items[0], modifiers);
     return extension.awaitMessage("click");
   }
 
   const plain = await click();
   is(plain.modifiers.length, 0, "modifiers array empty with a plain click");
 
   const shift = await click({shiftKey: true});
--- a/browser/components/extensions/test/browser/head.js
+++ b/browser/components/extensions/test/browser/head.js
@@ -315,28 +315,31 @@ async function openExtensionContextMenu(
   let contextMenu = await openContextMenu(selector);
   let topLevelMenu = contextMenu.getElementsByAttribute("ext-type", "top-level-menu");
 
   // Return null if the extension only has one item and therefore no extension menu.
   if (topLevelMenu.length == 0) {
     return null;
   }
 
-  let extensionMenu = topLevelMenu[0].childNodes[0];
+  let extensionMenu = topLevelMenu[0];
   let popupShownPromise = BrowserTestUtils.waitForEvent(contextMenu, "popupshown");
   EventUtils.synthesizeMouseAtCenter(extensionMenu, {});
   await popupShownPromise;
   return extensionMenu;
 }
 
 async function closeExtensionContextMenu(itemToSelect, modifiers = {}) {
   let contentAreaContextMenu = document.getElementById("contentAreaContextMenu");
   let popupHiddenPromise = BrowserTestUtils.waitForEvent(contentAreaContextMenu, "popuphidden");
   EventUtils.synthesizeMouseAtCenter(itemToSelect, modifiers);
-  return popupHiddenPromise;
+  await popupHiddenPromise;
+
+  // Bug 1351638: parent menu fails to close intermittently, make sure it does.
+  contentAreaContextMenu.hidePopup();
 }
 
 async function openChromeContextMenu(menuId, target, win = window) {
   const node = win.document.querySelector(target);
   const menu = win.document.getElementById(menuId);
   const shown = BrowserTestUtils.waitForEvent(menu, "popupshown");
   EventUtils.synthesizeMouseAtCenter(node, {type: "contextmenu"}, win);
   await shown;