Bug 1400256 - Use WebElement for marshaling web elements in evaluate.fromJSON. r?whimboo draft
authorAndreas Tolfsen <ato@sny.no>
Thu, 05 Oct 2017 17:55:31 +0100
changeset 683315 5c130420a2cf9ad81edf90605fcfd2398401ed33
parent 683314 07818bbb5ba78bb9281d86468e3b4bf08c414f9c
child 683316 9180b677e04d0c3cf33d0899e19a876136c23492
push id85331
push userbmo:ato@sny.no
push dateThu, 19 Oct 2017 14:55:23 +0000
reviewerswhimboo
bugs1400256
milestone58.0a1
Bug 1400256 - Use WebElement for marshaling web elements in evaluate.fromJSON. r?whimboo MozReview-Commit-ID: KwjZ60WlyKp
testing/marionette/evaluate.js
--- a/testing/marionette/evaluate.js
+++ b/testing/marionette/evaluate.js
@@ -6,17 +6,20 @@
 
 const {classes: Cc, interfaces: Ci, utils: Cu, results: Cr} = Components;
 
 Cu.import("resource://gre/modules/Log.jsm");
 Cu.import("resource://gre/modules/NetUtil.jsm");
 Cu.import("resource://gre/modules/Timer.jsm");
 Cu.import("resource://gre/modules/XPCOMUtils.jsm");
 
-Cu.import("chrome://marionette/content/element.js");
+const {
+  element,
+  WebElement,
+} = Cu.import("chrome://marionette/content/element.js", {});
 const {
   JavaScriptError,
   ScriptTimeoutError,
   WebDriverError,
 } = Cu.import("chrome://marionette/content/error.js", {});
 
 const log = Log.repository.getLogger("Marionette");
 
@@ -192,16 +195,24 @@ evaluate.sandbox = function(sb, script, 
  *     Known element store to look up web elements from.  If undefined,
  *     the web element references are returned instead.
  * @param {WindowProxy=} window
  *     Current browsing context, if <var>seenEls</var> is provided.
  *
  * @return {Object}
  *     Same object as provided by <var>obj</var> with the web elements
  *     replaced by DOM elements.
+ *
+ * @throws {NoSuchElementError}
+ *     If <var>seenEls</var> is given and the web element reference
+ *     has not been seen before.
+ * @throws {StaleElementReferenceError}
+ *     If <var>seenEls</var> is given and the element has gone stale,
+ *     indicating it is no longer attached to the DOM, or its node
+ *     document is no longer the active document.
  */
 evaluate.fromJSON = function(obj, seenEls = undefined, window = undefined) {
   switch (typeof obj) {
     case "boolean":
     case "number":
     case "string":
     default:
       return obj;
@@ -210,27 +221,22 @@ evaluate.fromJSON = function(obj, seenEl
       if (obj === null) {
         return obj;
 
       // arrays
       } else if (Array.isArray(obj)) {
         return obj.map(e => evaluate.fromJSON(e, seenEls, window));
 
       // web elements
-      } else if (Object.keys(obj).includes(element.Key) ||
-          Object.keys(obj).includes(element.LegacyKey)) {
-        /* eslint-disable */
-        let uuid = obj[element.Key] || obj[element.LegacyKey];
-        let el = seenEls.get(uuid, window);
-        /* eslint-enable */
-        if (!el) {
-          throw new WebDriverError(`Unknown element: ${uuid}`);
+      } else if (WebElement.isReference(obj)) {
+        let webEl = WebElement.fromJSON(obj);
+        if (seenEls) {
+          return seenEls.get(webEl, window);
         }
-        return el;
-
+        return webEl;
       }
 
       // arbitrary objects
       let rv = {};
       for (let prop in obj) {
         rv[prop] = evaluate.fromJSON(obj[prop], seenEls, window);
       }
       return rv;