Bug 1202663 - Use dispatcher for screen capture command in listener. r=AutomatedTester, r=jgriffin, a=test-only
☠☠ backed out by ffa9e4184d55 ☠ ☠
authorAndreas Tolfsen <ato@mozilla.com>
Fri, 09 Oct 2015 12:02:42 +0100
changeset 284572 c615a2e6b269c268e62e08460c42fa3e00cde229
parent 284571 db7756e6f76f47ab7e06ca4736501328377e781d
child 284573 4149b264250c134387df66ba5c2a2be6316aafc1
push id8597
push usercbook@mozilla.com
push dateMon, 19 Oct 2015 14:13:30 +0000
treeherdermozilla-aurora@cfaf54890d17 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersAutomatedTester, jgriffin, test-only
bugs1202663
milestone43.0a2
Bug 1202663 - Use dispatcher for screen capture command in listener. r=AutomatedTester, r=jgriffin, a=test-only r=dburns r=jgriffin
testing/marionette/driver.js
testing/marionette/listener.js
--- a/testing/marionette/driver.js
+++ b/testing/marionette/driver.js
@@ -2519,16 +2519,18 @@ GeckoDriver.prototype.clearImportedScrip
  *     Reference to a web element.
  * @param {string} highlights
  *     List of web elements to highlight.
  *
  * @return {string}
  *     PNG image encoded as base64 encoded string.
  */
 GeckoDriver.prototype.takeScreenshot = function(cmd, resp) {
+  let {id, highlights, full} = cmd.parameters;
+
   switch (this.context) {
     case Context.CHROME:
       let win = this.getCurrentWindow();
       let canvas = win.document.createElementNS("http://www.w3.org/1999/xhtml", "canvas");
       let doc;
       if (this.appName == "B2G") {
         doc = win.document.body;
       } else {
@@ -2561,20 +2563,17 @@ GeckoDriver.prototype.takeScreenshot = f
       context.scale(scale, scale);
       context.drawWindow(win, 0, 0, width, height, "rgb(255,255,255)", flags);
       let dataUrl = canvas.toDataURL("image/png", "");
       let data = dataUrl.substring(dataUrl.indexOf(",") + 1);
       resp.body.value = data;
       break;
 
     case Context.CONTENT:
-      resp.body.value = yield this.listener.takeScreenshot({
-        id: cmd.parameters.id,
-        highlights: cmd.parameters.highlights,
-        full: cmd.parameters.full});
+      return this.listener.takeScreenshot(id, highlights, full);
       break;
   }
 };
 
 /**
  * Get the current browser orientation.
  *
  * Will return one of the valid primary orientation values
--- a/testing/marionette/listener.js
+++ b/testing/marionette/listener.js
@@ -211,16 +211,17 @@ var findElementContentFn = dispatch(find
 var findElementsContentFn = dispatch(findElementsContent);
 var isElementSelectedFn = dispatch(isElementSelected);
 var clearElementFn = dispatch(clearElement);
 var isElementDisplayedFn = dispatch(isElementDisplayed);
 var getElementValueOfCssPropertyFn = dispatch(getElementValueOfCssProperty);
 var switchToShadowRootFn = dispatch(switchToShadowRoot);
 var getCookiesFn = dispatch(getCookies);
 var singleTapFn = dispatch(singleTap);
+var takeScreenshotFn = dispatch(takeScreenshot);
 
 /**
  * Start all message listeners
  */
 function startListeners() {
   addMessageListenerId("Marionette:receiveFiles", receiveFiles);
   addMessageListenerId("Marionette:newSession", newSession);
   addMessageListenerId("Marionette:executeScript", executeScript);
@@ -255,17 +256,17 @@ function startListeners() {
   addMessageListenerId("Marionette:switchToFrame", switchToFrame);
   addMessageListenerId("Marionette:switchToShadowRoot", switchToShadowRootFn);
   addMessageListenerId("Marionette:deleteSession", deleteSession);
   addMessageListenerId("Marionette:sleepSession", sleepSession);
   addMessageListenerId("Marionette:emulatorCmdResult", emulatorCmdResult);
   addMessageListenerId("Marionette:importScript", importScript);
   addMessageListenerId("Marionette:getAppCacheStatus", getAppCacheStatus);
   addMessageListenerId("Marionette:setTestName", setTestName);
-  addMessageListenerId("Marionette:takeScreenshot", takeScreenshot);
+  addMessageListenerId("Marionette:takeScreenshot", takeScreenshotFn);
   addMessageListenerId("Marionette:addCookie", addCookie);
   addMessageListenerId("Marionette:getCookies", getCookiesFn);
   addMessageListenerId("Marionette:deleteAllCookies", deleteAllCookies);
   addMessageListenerId("Marionette:deleteCookie", deleteCookie);
 }
 
 /**
  * Used during newSession and restart, called to set up the modal dialog listener in b2g
@@ -359,17 +360,17 @@ function deleteSession(msg) {
   removeMessageListenerId("Marionette:switchToFrame", switchToFrame);
   removeMessageListenerId("Marionette:switchToShadowRoot", switchToShadowRootFn);
   removeMessageListenerId("Marionette:deleteSession", deleteSession);
   removeMessageListenerId("Marionette:sleepSession", sleepSession);
   removeMessageListenerId("Marionette:emulatorCmdResult", emulatorCmdResult);
   removeMessageListenerId("Marionette:importScript", importScript);
   removeMessageListenerId("Marionette:getAppCacheStatus", getAppCacheStatus);
   removeMessageListenerId("Marionette:setTestName", setTestName);
-  removeMessageListenerId("Marionette:takeScreenshot", takeScreenshot);
+  removeMessageListenerId("Marionette:takeScreenshot", takeScreenshotFn);
   removeMessageListenerId("Marionette:addCookie", addCookie);
   removeMessageListenerId("Marionette:getCookies", getCookiesFn);
   removeMessageListenerId("Marionette:deleteAllCookies", deleteAllCookies);
   removeMessageListenerId("Marionette:deleteCookie", deleteCookie);
   if (isB2G) {
     content.removeEventListener("mozbrowsershowmodalprompt", modalHandler, false);
   }
   elementManager.reset();
@@ -1997,94 +1998,87 @@ function importScript(msg) {
  * Takes a screen capture of the given web element if <code>id</code>
  * property exists in the message's JSON object, or if null captures
  * the bounding box of the current frame.
  *
  * If given an array of web element references in
  * <code>msg.json.highlights</code>, a red box will be painted around
  * them to highlight their position.
  */
-function takeScreenshot(msg) {
+function takeScreenshot(id, highlights, full) {
   let node = null;
-  if (msg.json.id) {
-    try {
-      node = elementManager.getKnownElement(msg.json.id, curContainer)
-    }
-    catch (e) {
-      sendResponse(e.message, e.code, e.stack, msg.json.command_id);
-      return;
-    }
-  }
-  else {
+  if (id) {
+    node = elementManager.getKnownElement(id, curContainer)
+  } else {
     node = curContainer.frame;
   }
-  let highlights = msg.json.highlights;
 
-  var document = curContainer.frame.document;
-  var rect, win, width, height, left, top;
+  let document = curContainer.frame.document;
+  let rect, win, width, height, left, top;
+
   // node can be either a window or an arbitrary DOM node
   if (node == curContainer.frame) {
     // node is a window
     win = node;
-    if (msg.json.full) {
+    if (full) {
       // the full window
       width = document.body.scrollWidth;
       height = document.body.scrollHeight;
       top = 0;
       left = 0;
-    }
-    else {
+    } else {
       // only the viewport
       width = document.documentElement.clientWidth;
       height = document.documentElement.clientHeight;
       left = curContainer.frame.pageXOffset;
       top = curContainer.frame.pageYOffset;
     }
-  }
-  else {
+  } else {
     // node is an arbitrary DOM node
     win = node.ownerDocument.defaultView;
     rect = node.getBoundingClientRect();
     width = rect.width;
     height = rect.height;
     top = rect.top;
     left = rect.left;
   }
 
-  var canvas = document.createElementNS("http://www.w3.org/1999/xhtml",
-                                        "canvas");
+  let canvas = document.createElementNS(
+      "http://www.w3.org/1999/xhtml", "canvas");
   canvas.width = width;
   canvas.height = height;
-  var ctx = canvas.getContext("2d");
-  // Draws the DOM contents of the window to the canvas
+  let ctx = canvas.getContext("2d");
+
+  // draws the DOM contents of the window to the canvas
   ctx.drawWindow(win, left, top, width, height, "rgb(255,255,255)");
 
-  // This section is for drawing a red rectangle around each element
+  // this section is for drawing a red rectangle around each element
   // passed in via the highlights array
   if (highlights) {
     ctx.lineWidth = "2";
     ctx.strokeStyle = "red";
     ctx.save();
 
     for (var i = 0; i < highlights.length; ++i) {
-      var elem = elementManager.getKnownElement(highlights[i], curContainer);
+      let elem = elementManager.getKnownElement(highlights[i], curContainer);
       rect = elem.getBoundingClientRect();
 
-      var offsetY = -top;
-      var offsetX = -left;
+      let offsetY = -top;
+      let offsetX = -left;
 
-      // Draw the rectangle
-      ctx.strokeRect(rect.left + offsetX,
-                     rect.top + offsetY,
-                     rect.width,
-                     rect.height);
+      // draw the rectangle
+      ctx.strokeRect(
+          rect.left + offsetX,
+          rect.top + offsetY,
+          rect.width,
+          rect.height);
     }
   }
 
-  // Return the Base64 encoded string back to the client so that it
-  // can save the file to disk if it is required
-  var dataUrl = canvas.toDataURL("image/png", "");
-  var data = dataUrl.substring(dataUrl.indexOf(",") + 1);
-  sendResponse({value: data}, msg.json.command_id);
+  // return the Base64 encoded string back to the client
+  // so that it can save the file to disk if it is required
+  let dataUrl = canvas.toDataURL("image/png", "");
+  let encoded = dataUrl.substring(dataUrl.indexOf(",") + 1);
+  return encoded;
 }
 
 // Call register self when we get loaded
 registerSelf();