Bug 1245383 - Use ContentTask.spawn to access the content window in 2 scratchpad tests; r=ochameau
authorPatrick Brosset <pbrosset@mozilla.com>
Mon, 07 Mar 2016 17:56:05 +0100
changeset 287028 92fc2f7c1932c2de200fe11c818818836e9fb100
parent 287027 9a42fa7fb4ab6da62b1df606e122642d73fb6556
child 287029 b8e594c21349c24f07bf6a63764f3c1bb9734e46
push id18044
push userpbrosset@mozilla.com
push dateMon, 07 Mar 2016 16:58:04 +0000
treeherderfx-team@92fc2f7c1932 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersochameau
bugs1245383
milestone47.0a1
Bug 1245383 - Use ContentTask.spawn to access the content window in 2 scratchpad tests; r=ochameau browser_scratchpad_contexts.js and browser_scratchpad_execute_print.js used to access javascript properties on the content window object by using 'content.' directly. Now these tests use 'ContentTask.spawn' instead, which required the runAsyncCallbackTests helper to be changed so it would use a Task and yield on the promises returned by prepare and then. MozReview-Commit-ID: Cgw2mRxPrP4
devtools/client/scratchpad/test/browser_scratchpad_contexts.js
devtools/client/scratchpad/test/browser_scratchpad_execute_print.js
devtools/client/scratchpad/test/head.js
--- a/devtools/client/scratchpad/test/browser_scratchpad_contexts.js
+++ b/devtools/client/scratchpad/test/browser_scratchpad_contexts.js
@@ -1,67 +1,66 @@
 /* vim: set ts=2 et sw=2 tw=80: */
 /* Any copyright is dedicated to the Public Domain.
    http://creativecommons.org/publicdomain/zero/1.0/ */
+"use strict";
 
-function test()
-{
+function test() {
   waitForExplicitFinish();
 
   gBrowser.selectedTab = gBrowser.addTab();
   gBrowser.selectedBrowser.addEventListener("load", function onLoad() {
     gBrowser.selectedBrowser.removeEventListener("load", onLoad, true);
     openScratchpad(runTests);
   }, true);
 
   content.location = "data:text/html,test context switch in Scratchpad";
 }
 
-
-function runTests()
-{
+function runTests() {
   let sp = gScratchpadWindow.Scratchpad;
   let contentMenu = gScratchpadWindow.document.getElementById("sp-menu-content");
   let chromeMenu = gScratchpadWindow.document.getElementById("sp-menu-browser");
   let notificationBox = sp.notificationBox;
 
   ok(contentMenu, "found #sp-menu-content");
   ok(chromeMenu, "found #sp-menu-browser");
   ok(notificationBox, "found Scratchpad.notificationBox");
 
   let tests = [{
     method: "run",
-    prepare: function() {
+    prepare: function*() {
       sp.setContentContext();
 
       is(sp.executionContext, gScratchpadWindow.SCRATCHPAD_CONTEXT_CONTENT,
          "executionContext is content");
 
       is(contentMenu.getAttribute("checked"), "true",
          "content menuitem is checked");
 
       isnot(chromeMenu.getAttribute("checked"), "true",
          "chrome menuitem is not checked");
 
       ok(!notificationBox.currentNotification,
          "there is no notification in content context");
 
       sp.editor.setText("window.foobarBug636725 = 'aloha';");
 
-      ok(!content.wrappedJSObject.foobarBug636725,
-         "no content.foobarBug636725");
+      let pageResult = yield inContent(function*() {
+        return content.wrappedJSObject.foobarBug636725;
+      });
+      ok(!pageResult, "no content.foobarBug636725");
     },
-    then: function() {
+    then: function*() {
       is(content.wrappedJSObject.foobarBug636725, "aloha",
          "content.foobarBug636725 has been set");
     }
-  },
-  {
+  }, {
     method: "run",
-    prepare: function() {
+    prepare: function*() {
       sp.setBrowserContext();
 
       is(sp.executionContext, gScratchpadWindow.SCRATCHPAD_CONTEXT_BROWSER,
          "executionContext is chrome");
 
       is(chromeMenu.getAttribute("checked"), "true",
          "chrome menuitem is checked");
 
@@ -72,80 +71,75 @@ function runTests()
          "there is a notification in browser context");
 
       let [ from, to ] = sp.editor.getPosition(31, 32);
       sp.editor.replaceText("2'", from, to);
 
       is(sp.getText(), "window.foobarBug636725 = 'aloha2';",
          "setText() worked");
     },
-    then: function() {
+    then: function*() {
       is(window.foobarBug636725, "aloha2",
          "window.foobarBug636725 has been set");
 
       delete window.foobarBug636725;
       ok(!window.foobarBug636725, "no window.foobarBug636725");
     }
-  },
-  {
+  }, {
     method: "run",
-    prepare: function() {
+    prepare: function*() {
       sp.editor.replaceText("gBrowser", sp.editor.getPosition(7));
 
       is(sp.getText(), "window.gBrowser",
          "setText() worked with no end for the replace range");
     },
-    then: function([, , result]) {
+    then: function*([, , result]) {
       is(result.class, "XULElement",
          "chrome context has access to chrome objects");
     }
-  },
-  {
+  }, {
     method: "run",
-    prepare: function() {
+    prepare: function*() {
       // Check that the sandbox is cached.
       sp.editor.setText("typeof foobarBug636725cache;");
     },
-    then: function([, , result]) {
+    then: function*([, , result]) {
       is(result, "undefined", "global variable does not exist");
     }
-  },
-  {
+  }, {
     method: "run",
-    prepare: function() {
+    prepare: function*() {
       sp.editor.setText("window.foobarBug636725cache = 'foo';" +
                  "typeof foobarBug636725cache;");
     },
-    then: function([, , result]) {
+    then: function*([, , result]) {
       is(result, "string",
          "global variable exists across two different executions");
     }
-  },
-  {
+  }, {
     method: "run",
-    prepare: function() {
+    prepare: function*() {
       sp.editor.setText("window.foobarBug636725cache2 = 'foo';" +
                  "typeof foobarBug636725cache2;");
     },
-    then: function([, , result]) {
+    then: function*([, , result]) {
       is(result, "string",
          "global variable exists across two different executions");
     }
-  },
-  {
+  }, {
     method: "run",
-    prepare: function() {
+    prepare: function*() {
       sp.setContentContext();
 
       is(sp.executionContext, gScratchpadWindow.SCRATCHPAD_CONTEXT_CONTENT,
          "executionContext is content");
 
       sp.editor.setText("typeof foobarBug636725cache2;");
     },
-    then: function([, , result]) {
+    then: function*([, , result]) {
       is(result, "undefined",
          "global variable no longer exists after changing the context");
     }
   }];
 
   runAsyncCallbackTests(sp, tests).then(() => {
     sp.setBrowserContext();
     sp.editor.setText("delete foobarBug636725cache;" +
--- a/devtools/client/scratchpad/test/browser_scratchpad_execute_print.js
+++ b/devtools/client/scratchpad/test/browser_scratchpad_execute_print.js
@@ -1,89 +1,95 @@
 /* vim: set ts=2 et sw=2 tw=80: */
 /* Any copyright is dedicated to the Public Domain.
    http://creativecommons.org/publicdomain/zero/1.0/ */
+"use strict";
 
-function test()
-{
+function test() {
   waitForExplicitFinish();
 
   gBrowser.selectedTab = gBrowser.addTab();
   gBrowser.selectedBrowser.addEventListener("load", function onTabLoad() {
     gBrowser.selectedBrowser.removeEventListener("load", onTabLoad, true);
     openScratchpad(runTests);
   }, true);
 
   content.location = "data:text/html,<p>test run() and display() in Scratchpad";
 }
 
-
-function runTests()
-{
+function runTests() {
   let sp = gScratchpadWindow.Scratchpad;
   let tests = [{
     method: "run",
-    prepare: function() {
-      content.wrappedJSObject.foobarBug636725 = 1;
+    prepare: function*() {
+      yield inContent(function*() {
+        content.wrappedJSObject.foobarBug636725 = 1;
+      });
       sp.editor.setText("++window.foobarBug636725");
     },
-    then: function([code, , result]) {
+    then: function*([code, , result]) {
       is(code, sp.getText(), "code is correct");
-      is(result, content.wrappedJSObject.foobarBug636725,
+
+      let pageResult = yield inContent(function*() {
+        return content.wrappedJSObject.foobarBug636725;
+      });
+      is(result, pageResult,
          "result is correct");
 
       is(sp.getText(), "++window.foobarBug636725",
          "run() does not change the editor content");
 
-      is(content.wrappedJSObject.foobarBug636725, 2,
-         "run() updated window.foobarBug636725");
+      is(pageResult, 2, "run() updated window.foobarBug636725");
     }
-  },
-  {
+  }, {
     method: "display",
-    prepare: function() {},
-    then: function() {
-      is(content.wrappedJSObject.foobarBug636725, 3,
-         "display() updated window.foobarBug636725");
+    prepare: function*() {},
+    then: function*() {
+      let pageResult = yield inContent(function*() {
+        return content.wrappedJSObject.foobarBug636725;
+      });
+      is(pageResult, 3, "display() updated window.foobarBug636725");
 
       is(sp.getText(), "++window.foobarBug636725\n/*\n3\n*/",
          "display() shows evaluation result in the textbox");
 
       is(sp.editor.getSelection(), "\n/*\n3\n*/", "getSelection is correct");
     }
-  },
-  {
+  }, {
     method: "run",
-    prepare: function() {
+    prepare: function*() {
       sp.editor.setText("window.foobarBug636725 = 'a';\n" +
         "window.foobarBug636725 = 'b';");
       sp.editor.setSelection({ line: 0, ch: 0 }, { line: 0, ch: 29 });
     },
-    then: function([code, , result]) {
+    then: function*([code, , result]) {
       is(code, "window.foobarBug636725 = 'a';", "code is correct");
       is(result, "a", "result is correct");
 
       is(sp.getText(), "window.foobarBug636725 = 'a';\n" +
                        "window.foobarBug636725 = 'b';",
          "run() does not change the textbox value");
 
-      is(content.wrappedJSObject.foobarBug636725, "a",
-         "run() worked for the selected range");
+      let pageResult = yield inContent(function*() {
+        return content.wrappedJSObject.foobarBug636725;
+      });
+      is(pageResult, "a", "run() worked for the selected range");
     }
-  },
-  {
+  }, {
     method: "display",
-    prepare: function() {
+    prepare: function*() {
       sp.editor.setText("window.foobarBug636725 = 'c';\n" +
                  "window.foobarBug636725 = 'b';");
       sp.editor.setSelection({ line: 0, ch: 0 }, { line: 0, ch: 22 });
     },
-    then: function() {
-      is(content.wrappedJSObject.foobarBug636725, "a",
-         "display() worked for the selected range");
+    then: function*() {
+      let pageResult = yield inContent(function*() {
+        return content.wrappedJSObject.foobarBug636725;
+      });
+      is(pageResult, "a", "display() worked for the selected range");
 
       is(sp.getText(), "window.foobarBug636725" +
                        "\n/*\na\n*/" +
                        " = 'c';\n" +
                        "window.foobarBug636725 = 'b';",
          "display() shows evaluation result in the textbox");
 
       is(sp.editor.getSelection(), "\n/*\na\n*/", "getSelection is correct");
--- a/devtools/client/scratchpad/test/head.js
+++ b/devtools/client/scratchpad/test/head.js
@@ -186,31 +186,29 @@ function runAsyncTests(aScratchpad, aTes
  *          Scratchpad method to use, one of "run", "display", or "inspect".
  *        - prepare
  *          The callback to run just prior to executing the scratchpad method.
  *        - then
  *          The callback to run when the scratchpad execution promise resolves.
  * @return Promise
  *         The promise that will be resolved when all tests are finished.
  */
-function runAsyncCallbackTests(aScratchpad, aTests)
-{
-  let deferred = promise.defer();
+var runAsyncCallbackTests = Task.async(function*(aScratchpad, aTests) {
+  for (let {prepare, method, then} of aTests) {
+    yield prepare();
+    let res = yield aScratchpad[method]();
+    yield then(res);
+  }
+});
 
-  (function runTest() {
-    if (aTests.length) {
-      let test = aTests.shift();
-      test.prepare();
-      aScratchpad[test.method]().then(test.then.bind(test)).then(runTest);
-    } else {
-      deferred.resolve();
-    }
-  })();
-
-  return deferred.promise;
+/**
+ * A simple wrapper for ContentTask.spawn for more compact code.
+ */
+function inContent(generator) {
+  return ContentTask.spawn(gBrowser.selectedBrowser, {}, generator);
 }
 
 function cleanup()
 {
   if (gScratchpadWindow) {
     gScratchpadWindow.close();
     gScratchpadWindow = null;
   }