Bug 1382487 - Fix devtools onSelectionChanged API event test case intermittency. draft
authorLuca Greco <lgreco@mozilla.com>
Tue, 15 Aug 2017 17:08:27 +0200
changeset 649066 f547589fbdc9f1fa8a8db659caeb94425fe1a7fa
parent 648573 a6a1f5c1d971dbee67ba6eec7ead7902351ddca2
child 726988 41870b89c8005f94418a43874afc5a81be423cd6
push id74934
push userluca.greco@alcacoop.it
push dateFri, 18 Aug 2017 14:47:11 +0000
bugs1382487
milestone57.0a1
Bug 1382487 - Fix devtools onSelectionChanged API event test case intermittency. MozReview-Commit-ID: GvljckBZpgN
browser/components/extensions/test/browser/browser-common.ini
browser/components/extensions/test/browser/browser_ext_devtools_panels_elements.js
--- a/browser/components/extensions/test/browser/browser-common.ini
+++ b/browser/components/extensions/test/browser/browser-common.ini
@@ -68,17 +68,16 @@ skip-if = (os == 'win' && !debug) # bug 
 [browser_ext_currentWindow.js]
 [browser_ext_devtools_inspectedWindow.js]
 [browser_ext_devtools_inspectedWindow_eval_bindings.js]
 [browser_ext_devtools_inspectedWindow_reload.js]
 [browser_ext_devtools_network.js]
 [browser_ext_devtools_page.js]
 [browser_ext_devtools_panel.js]
 [browser_ext_devtools_panels_elements.js]
-skip-if = true # bug 1382487
 [browser_ext_geckoProfiler_symbolicate.js]
 [browser_ext_getViews.js]
 [browser_ext_identity_indication.js]
 [browser_ext_incognito_views.js]
 [browser_ext_incognito_popup.js]
 [browser_ext_lastError.js]
 [browser_ext_menus.js]
 [browser_ext_omnibox.js]
--- a/browser/components/extensions/test/browser/browser_ext_devtools_panels_elements.js
+++ b/browser/components/extensions/test/browser/browser_ext_devtools_panels_elements.js
@@ -6,35 +6,58 @@ XPCOMUtils.defineLazyModuleGetter(this, 
                                   "resource://devtools/client/framework/gDevTools.jsm");
 XPCOMUtils.defineLazyModuleGetter(this, "devtools",
                                   "resource://devtools/shared/Loader.jsm");
 
 add_task(async function test_devtools_panels_elements_onSelectionChanged() {
   let tab = await BrowserTestUtils.openNewForegroundTab(gBrowser, "http://mochi.test:8888/");
 
   function devtools_page() {
-    let doTabReload = true;
+    let isReloading = false;
+    let collectedEvalResults = [];
 
     browser.devtools.panels.elements.onSelectionChanged.addListener(async () => {
       const [
         evalResult, exceptionInfo,
       ] = await browser.devtools.inspectedWindow.eval("$0 && $0.tagName");
 
       if (exceptionInfo) {
         browser.test.fail("Unexpected exceptionInfo on inspectedWindow.eval: " +
                           JSON.stringify(exceptionInfo));
       }
 
-      browser.test.sendMessage("devtools_eval_result", evalResult);
+      collectedEvalResults.push(evalResult);
+
+      // The eval results that are happening during the reload are going to
+      // be retrieved all at once using the "collected_devttols_eval_results:request".
+      if (!isReloading) {
+        browser.test.sendMessage("devtools_eval_result", evalResult);
+      }
+    });
 
-      if (doTabReload) {
-        // Force a reload to test that the expected onSelectionChanged events are sent
-        // while the page is navigating and once it has been fully reloaded.
-        doTabReload = false;
-        await browser.devtools.inspectedWindow.eval("window.location.reload();");
+    browser.test.onMessage.addListener(msg => {
+      switch (msg) {
+        case "inspectedWindow_reload": {
+          // Force a reload to test that the expected onSelectionChanged events are sent
+          // while the page is navigating and once it has been fully reloaded.
+          isReloading = true;
+          collectedEvalResults = [];
+          browser.devtools.inspectedWindow.eval("window.location.reload();");
+          break;
+        }
+
+        case "collected_devtools_eval_results:request": {
+          browser.test.sendMessage("collected_devtools_eval_results:reply",
+                                   collectedEvalResults);
+          break;
+        }
+
+        default: {
+          browser.test.fail(`Received unexpected test.onMesssage: ${msg}`);
+        }
       }
     });
 
     browser.test.sendMessage("devtools_page_loaded");
   }
 
   let extension = ExtensionTestUtils.loadExtension({
     manifest: {
@@ -58,33 +81,42 @@ add_task(async function test_devtools_pa
 
   let target = devtools.TargetFactory.forTab(tab);
 
   const toolbox = await gDevTools.showToolbox(target, "webconsole");
   info("developer toolbox opened");
 
   await extension.awaitMessage("devtools_page_loaded");
 
-  toolbox.selectTool("inspector");
+  await toolbox.selectTool("inspector");
+
+  const inspector = toolbox.getPanel("inspector");
 
   const evalResult = await extension.awaitMessage("devtools_eval_result");
 
   is(evalResult, "BODY", "Got the expected onSelectionChanged once the inspector is selected");
 
-  const evalResultNavigating = await extension.awaitMessage("devtools_eval_result");
-
-  is(evalResultNavigating, undefined, "Got the expected onSelectionChanged once the tab is navigating");
-
-  const evalResultNavigated = await extension.awaitMessage("devtools_eval_result");
+  // Reload the inspected tab and wait for the inspector markup view to have been
+  // fully reloaded.
+  const onceMarkupReloaded = inspector.once("markuploaded");
+  extension.sendMessage("inspectedWindow_reload");
+  await onceMarkupReloaded;
 
-  is(evalResultNavigated, undefined, "Got the expected onSelectionChanged once the tab navigated");
+  // Retrieve the first and last collected eval result (the first is related to the
+  // page navigating away, the last one is related to the updated inspector markup view
+  // fully reloaded and the selection updated).
+  extension.sendMessage("collected_devtools_eval_results:request");
+  const collectedEvalResults = await extension.awaitMessage("collected_devtools_eval_results:reply");
+  const evalResultNavigating = collectedEvalResults.shift();
+  const evalResultOnceMarkupReloaded = collectedEvalResults.pop();
 
-  const evalResultReloaded = await extension.awaitMessage("devtools_eval_result");
+  is(evalResultNavigating, undefined,
+     "Got the expected onSelectionChanged once the tab is navigating");
 
-  is(evalResultReloaded, "BODY",
+  is(evalResultOnceMarkupReloaded, "BODY",
      "Got the expected onSelectionChanged once the tab has been completely reloaded");
 
   await gDevTools.closeToolbox(target);
 
   await target.destroy();
 
   await extension.unload();