Bug 1400256 - Use WebElement for marshaling web elements in evaluate.fromJSON. r?whimboo
MozReview-Commit-ID: KwjZ60WlyKp
--- 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;