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"
|
|
|
|
);
|
2017-10-31 23:02:07 +03:00
|
|
|
|
|
|
|
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
|
2019-05-08 16:42:30 +03:00
|
|
|
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);
|
2017-10-31 23:02:07 +03:00
|
|
|
|
|
|
|
// toJSON
|
|
|
|
equal(
|
|
|
|
"foo",
|
|
|
|
evaluate.toJSON({
|
|
|
|
toJSON() {
|
|
|
|
return "foo";
|
2019-07-05 12:01:24 +03:00
|
|
|
},
|
2017-10-31 23:02:07 +03:00
|
|
|
})
|
|
|
|
);
|
|
|
|
|
|
|
|
// arbitrary object
|
|
|
|
deepEqual({ foo: "bar" }, evaluate.toJSON({ foo: "bar" }));
|
|
|
|
|
|
|
|
run_next_test();
|
|
|
|
});
|
|
|
|
|
|
|
|
add_test(function test_toJSON_sequences() {
|
2018-04-11 22:26:53 +03:00
|
|
|
let input = [
|
|
|
|
null,
|
|
|
|
true,
|
|
|
|
[],
|
|
|
|
domEl,
|
|
|
|
{
|
|
|
|
toJSON() {
|
|
|
|
return "foo";
|
2019-07-05 12:01:24 +03:00
|
|
|
},
|
|
|
|
},
|
2018-04-11 22:26:53 +03:00
|
|
|
{ bar: "baz" },
|
|
|
|
];
|
2017-10-31 23:02:07 +03:00
|
|
|
let actual = evaluate.toJSON(input, seenEls);
|
|
|
|
|
|
|
|
equal(null, actual[0]);
|
|
|
|
equal(true, actual[1]);
|
|
|
|
deepEqual([], actual[2]);
|
2019-05-08 16:42:30 +03:00
|
|
|
ok(actual[3] instanceof WebElement);
|
2017-10-31 23:02:07 +03:00
|
|
|
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";
|
|
|
|
},
|
2019-07-05 12:01:24 +03:00
|
|
|
},
|
2017-10-31 23:02:07 +03:00
|
|
|
object: { bar: "baz" },
|
|
|
|
};
|
|
|
|
let actual = evaluate.toJSON(input, seenEls);
|
|
|
|
|
|
|
|
equal(null, actual.null);
|
|
|
|
equal(true, actual.boolean);
|
|
|
|
deepEqual([], actual.array);
|
2019-05-08 16:42:30 +03:00
|
|
|
ok(actual.webElement instanceof WebElement);
|
2017-10-31 23:02:07 +03:00
|
|
|
equal("foo", actual.toJSON);
|
|
|
|
deepEqual({ bar: "baz" }, actual.object);
|
|
|
|
|
|
|
|
run_next_test();
|
|
|
|
});
|
2018-07-06 20:35:21 +03:00
|
|
|
|
|
|
|
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();
|
|
|
|
});
|