gecko-dev/testing/marionette/test/unit/test_evaluate.js

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

190 строки
3.8 KiB
JavaScript
Исходник Обычный вид История

Bug 1514594: Part 3 - Change ChromeUtils.import API. *** Bug 1514594: Part 3a - Change ChromeUtils.import to return an exports object; not pollute global. r=mccr8 This changes the behavior of ChromeUtils.import() to return an exports object, rather than a module global, in all cases except when `null` is passed as a second argument, and changes the default behavior not to pollute the global scope with the module's exports. Thus, the following code written for the old model: ChromeUtils.import("resource://gre/modules/Services.jsm"); is approximately the same as the following, in the new model: var {Services} = ChromeUtils.import("resource://gre/modules/Services.jsm"); Since the two behaviors are mutually incompatible, this patch will land with a scripted rewrite to update all existing callers to use the new model rather than the old. *** Bug 1514594: Part 3b - Mass rewrite all JS code to use the new ChromeUtils.import API. rs=Gijs This was done using the followng script: https://bitbucket.org/kmaglione/m-c-rewrites/src/tip/processors/cu-import-exports.jsm *** Bug 1514594: Part 3c - Update ESLint plugin for ChromeUtils.import API changes. r=Standard8 Differential Revision: https://phabricator.services.mozilla.com/D16747 *** Bug 1514594: Part 3d - Remove/fix hundreds of duplicate imports from sync tests. r=Gijs Differential Revision: https://phabricator.services.mozilla.com/D16748 *** Bug 1514594: Part 3e - Remove no-op ChromeUtils.import() calls. r=Gijs Differential Revision: https://phabricator.services.mozilla.com/D16749 *** Bug 1514594: Part 3f.1 - Cleanup various test corner cases after mass rewrite. r=Gijs *** Bug 1514594: Part 3f.2 - Cleanup various non-test corner cases after mass rewrite. r=Gijs Differential Revision: https://phabricator.services.mozilla.com/D16750 --HG-- extra : rebase_source : 359574ee3064c90f33bf36c2ebe3159a24cc8895 extra : histedit_source : b93c8f42808b1599f9122d7842d2c0b3e656a594%2C64a3a4e3359dc889e2ab2b49461bab9e27fc10a7
2019-01-17 21:18:31 +03:00
const { element, WebElement } = ChromeUtils.import(
"chrome://marionette/content/element.js"
);
const { evaluate } = ChromeUtils.import(
"chrome://marionette/content/evaluate.js"
);
const SVGNS = "http://www.w3.org/2000/svg";
const XBLNS = "http://www.mozilla.org/xbl";
const XHTMLNS = "http://www.w3.org/1999/xhtml";
const XULNS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
class Element {
constructor(tagName, attrs = {}) {
this.tagName = tagName;
this.localName = tagName;
for (let attr in attrs) {
this[attr] = attrs[attr];
}
}
get nodeType() {
return 1;
}
get ELEMENT_NODE() {
return 1;
}
}
class DOMElement extends Element {
constructor(tagName, attrs = {}) {
super(tagName, attrs);
this.namespaceURI = XHTMLNS;
}
}
class SVGElement extends Element {
constructor(tagName, attrs = {}) {
super(tagName, attrs);
this.namespaceURI = SVGNS;
}
}
class XULElement extends Element {
constructor(tagName, attrs = {}) {
super(tagName, attrs);
this.namespaceURI = XULNS;
}
}
class XBLElement extends XULElement {
constructor(tagName, attrs = {}) {
super(tagName, attrs);
this.namespaceURI = XBLNS;
}
}
const domEl = new DOMElement("p");
const svgEl = new SVGElement("rect");
const xulEl = new XULElement("browser");
const xblEl = new XBLElement("framebox");
const seenEls = new element.Store();
add_test(function test_toJSON_types() {
// null
equal(null, evaluate.toJSON(undefined));
equal(null, evaluate.toJSON(null));
// primitives
equal(true, evaluate.toJSON(true));
equal(42, evaluate.toJSON(42));
equal("foo", evaluate.toJSON("foo"));
// collections
deepEqual([], evaluate.toJSON([]));
// elements
ok(evaluate.toJSON(domEl, seenEls) instanceof WebElement);
ok(evaluate.toJSON(svgEl, seenEls) instanceof WebElement);
ok(evaluate.toJSON(xulEl, seenEls) instanceof WebElement);
ok(evaluate.toJSON(xblEl, seenEls) instanceof WebElement);
// toJSON
equal(
"foo",
evaluate.toJSON({
toJSON() {
return "foo";
},
})
);
// arbitrary object
deepEqual({ foo: "bar" }, evaluate.toJSON({ foo: "bar" }));
run_next_test();
});
add_test(function test_toJSON_sequences() {
let input = [
null,
true,
[],
domEl,
{
toJSON() {
return "foo";
},
},
{ bar: "baz" },
];
let actual = evaluate.toJSON(input, seenEls);
equal(null, actual[0]);
equal(true, actual[1]);
deepEqual([], actual[2]);
ok(actual[3] instanceof WebElement);
equal("foo", actual[4]);
deepEqual({ bar: "baz" }, actual[5]);
run_next_test();
});
add_test(function test_toJSON_objects() {
let input = {
null: null,
boolean: true,
array: [],
webElement: domEl,
toJSON: {
toJSON() {
return "foo";
},
},
object: { bar: "baz" },
};
let actual = evaluate.toJSON(input, seenEls);
equal(null, actual.null);
equal(true, actual.boolean);
deepEqual([], actual.array);
ok(actual.webElement instanceof WebElement);
equal("foo", actual.toJSON);
deepEqual({ bar: "baz" }, actual.object);
run_next_test();
});
add_test(function test_isCyclic_noncyclic() {
for (let type of [true, 42, "foo", [], {}, null, undefined]) {
ok(!evaluate.isCyclic(type));
}
run_next_test();
});
add_test(function test_isCyclic_object() {
let obj = {};
obj.reference = obj;
ok(evaluate.isCyclic(obj));
run_next_test();
});
add_test(function test_isCyclic_array() {
let arr = [];
arr.push(arr);
ok(evaluate.isCyclic(arr));
run_next_test();
});
add_test(function test_isCyclic_arrayInObject() {
let arr = [];
arr.push(arr);
ok(evaluate.isCyclic({ arr }));
run_next_test();
});
add_test(function test_isCyclic_objectInArray() {
let obj = {};
obj.reference = obj;
ok(evaluate.isCyclic([obj]));
run_next_test();
});