зеркало из https://github.com/mozilla/gecko-dev.git
450 строки
12 KiB
JavaScript
450 строки
12 KiB
JavaScript
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
|
* You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
const {utils: Cu} = Components;
|
|
|
|
const {
|
|
ChromeWebElement,
|
|
ContentWebElement,
|
|
ContentWebFrame,
|
|
ContentWebWindow,
|
|
element,
|
|
WebElement,
|
|
} = Cu.import("chrome://marionette/content/element.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;
|
|
|
|
if (this.localName == "option") {
|
|
this.selected = false;
|
|
}
|
|
|
|
if (this.localName == "input" && ["checkbox", "radio"].includes(this.type)) {
|
|
this.checked = false;
|
|
}
|
|
}
|
|
|
|
getBoundingClientRect() {
|
|
return {
|
|
top: 0,
|
|
left: 0,
|
|
width: 100,
|
|
height: 100,
|
|
};
|
|
}
|
|
}
|
|
|
|
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");
|
|
|
|
class WindowProxy {
|
|
get parent() { return this; }
|
|
get self() { return this; }
|
|
toString() { return "[object Window]"; }
|
|
}
|
|
const domWin = new WindowProxy();
|
|
const domFrame = new class extends WindowProxy {
|
|
get parent() { return domWin; }
|
|
};
|
|
|
|
add_test(function test_isSelected() {
|
|
let checkbox = new DOMElement("input", {type: "checkbox"});
|
|
ok(!element.isSelected(checkbox));
|
|
checkbox.checked = true;
|
|
ok(element.isSelected(checkbox));
|
|
|
|
// selected is not a property of <input type=checkbox>
|
|
checkbox.selected = true;
|
|
checkbox.checked = false;
|
|
ok(!element.isSelected(checkbox));
|
|
|
|
let option = new DOMElement("option");
|
|
ok(!element.isSelected(option));
|
|
option.selected = true;
|
|
ok(element.isSelected(option));
|
|
|
|
// checked is not a property of <option>
|
|
option.checked = true;
|
|
option.selected = false;
|
|
ok(!element.isSelected(option));
|
|
|
|
// anything else should not be selected
|
|
for (let typ of [domEl, undefined, null, "foo", true, [], {}]) {
|
|
ok(!element.isSelected(typ));
|
|
}
|
|
|
|
run_next_test();
|
|
});
|
|
|
|
add_test(function test_isElement() {
|
|
ok(element.isElement(domEl));
|
|
ok(element.isElement(svgEl));
|
|
ok(element.isElement(xulEl));
|
|
ok(!element.isElement(domWin));
|
|
ok(!element.isElement(domFrame));
|
|
for (let typ of [true, 42, {}, [], undefined, null]) {
|
|
ok(!element.isElement(typ));
|
|
}
|
|
|
|
run_next_test();
|
|
});
|
|
|
|
add_test(function test_isDOMElement() {
|
|
ok(element.isDOMElement(domEl));
|
|
ok(!element.isDOMElement(svgEl));
|
|
ok(!element.isDOMElement(xulEl));
|
|
ok(!element.isDOMElement(domWin));
|
|
ok(!element.isDOMElement(domFrame));
|
|
for (let typ of [true, 42, {}, [], undefined, null]) {
|
|
ok(!element.isDOMElement(typ));
|
|
}
|
|
|
|
run_next_test();
|
|
});
|
|
|
|
add_test(function test_isSVGElement() {
|
|
ok(element.isSVGElement(svgEl));
|
|
ok(!element.isSVGElement(domEl));
|
|
ok(!element.isSVGElement(xulEl));
|
|
ok(!element.isSVGElement(domWin));
|
|
ok(!element.isSVGElement(domFrame));
|
|
for (let typ of [true, 42, {}, [], undefined, null]) {
|
|
ok(!element.isSVGElement(typ));
|
|
}
|
|
|
|
run_next_test();
|
|
});
|
|
|
|
add_test(function test_isXULElement() {
|
|
ok(element.isXULElement(xulEl));
|
|
ok(element.isXULElement(xblEl));
|
|
ok(!element.isXULElement(domEl));
|
|
ok(!element.isXULElement(svgEl));
|
|
ok(!element.isDOMElement(domWin));
|
|
ok(!element.isDOMElement(domFrame));
|
|
for (let typ of [true, 42, {}, [], undefined, null]) {
|
|
ok(!element.isXULElement(typ));
|
|
}
|
|
|
|
run_next_test();
|
|
});
|
|
|
|
add_test(function test_isDOMWindow() {
|
|
ok(element.isDOMWindow(domWin));
|
|
ok(element.isDOMWindow(domFrame));
|
|
ok(!element.isDOMWindow(domEl));
|
|
ok(!element.isDOMWindow(svgEl));
|
|
ok(!element.isDOMWindow(xulEl));
|
|
for (let typ of [true, 42, {}, [], undefined, null]) {
|
|
ok(!element.isDOMWindow(typ));
|
|
}
|
|
|
|
run_next_test();
|
|
});
|
|
|
|
add_test(function test_coordinates() {
|
|
let p = element.coordinates(domEl);
|
|
ok(p.hasOwnProperty("x"));
|
|
ok(p.hasOwnProperty("y"));
|
|
equal("number", typeof p.x);
|
|
equal("number", typeof p.y);
|
|
|
|
deepEqual({x: 50, y: 50}, element.coordinates(domEl));
|
|
deepEqual({x: 10, y: 10}, element.coordinates(domEl, 10, 10));
|
|
deepEqual({x: -5, y: -5}, element.coordinates(domEl, -5, -5));
|
|
|
|
Assert.throws(() => element.coordinates(null));
|
|
|
|
Assert.throws(() => element.coordinates(domEl, "string", undefined));
|
|
Assert.throws(() => element.coordinates(domEl, undefined, "string"));
|
|
Assert.throws(() => element.coordinates(domEl, "string", "string"));
|
|
Assert.throws(() => element.coordinates(domEl, {}, undefined));
|
|
Assert.throws(() => element.coordinates(domEl, undefined, {}));
|
|
Assert.throws(() => element.coordinates(domEl, {}, {}));
|
|
Assert.throws(() => element.coordinates(domEl, [], undefined));
|
|
Assert.throws(() => element.coordinates(domEl, undefined, []));
|
|
Assert.throws(() => element.coordinates(domEl, [], []));
|
|
|
|
run_next_test();
|
|
});
|
|
|
|
add_test(function test_WebElement_ctor() {
|
|
let el = new WebElement("foo");
|
|
equal(el.uuid, "foo");
|
|
|
|
for (let t of [42, true, [], {}, null, undefined]) {
|
|
Assert.throws(() => new WebElement(t));
|
|
}
|
|
|
|
run_next_test();
|
|
});
|
|
|
|
add_test(function test_WebElemenet_is() {
|
|
let a = new WebElement("a");
|
|
let b = new WebElement("b");
|
|
|
|
ok(a.is(a));
|
|
ok(b.is(b));
|
|
ok(!a.is(b));
|
|
ok(!b.is(a));
|
|
|
|
ok(!a.is({}));
|
|
|
|
run_next_test();
|
|
});
|
|
|
|
add_test(function test_WebElement_from() {
|
|
ok(WebElement.from(domEl) instanceof ContentWebElement);
|
|
ok(WebElement.from(domWin) instanceof ContentWebWindow);
|
|
ok(WebElement.from(domFrame) instanceof ContentWebFrame);
|
|
ok(WebElement.from(xulEl) instanceof ChromeWebElement);
|
|
|
|
Assert.throws(() => WebElement.from({}), /Expected DOM window\/element/);
|
|
|
|
run_next_test();
|
|
});
|
|
|
|
add_test(function test_WebElement_fromJSON_ContentWebElement() {
|
|
const {Identifier, LegacyIdentifier} = ContentWebElement;
|
|
|
|
let refNew = {[Identifier]: "foo"};
|
|
let webElNew = WebElement.fromJSON(refNew);
|
|
ok(webElNew instanceof ContentWebElement);
|
|
equal(webElNew.uuid, "foo");
|
|
|
|
let refOld = {[LegacyIdentifier]: "foo"};
|
|
let webElOld = WebElement.fromJSON(refOld);
|
|
ok(webElOld instanceof ContentWebElement);
|
|
equal(webElOld.uuid, "foo");
|
|
|
|
ok(webElNew.is(webElOld));
|
|
ok(webElOld.is(webElNew));
|
|
|
|
let refBoth = {
|
|
[Identifier]: "foo",
|
|
[LegacyIdentifier]: "foo",
|
|
};
|
|
let webElBoth = WebElement.fromJSON(refBoth);
|
|
ok(webElBoth instanceof ContentWebElement);
|
|
equal(webElBoth.uuid, "foo");
|
|
|
|
ok(webElBoth.is(webElNew));
|
|
ok(webElBoth.is(webElOld));
|
|
ok(webElNew.is(webElBoth));
|
|
ok(webElOld.is(webElBoth));
|
|
|
|
let identifierPrecedence = {
|
|
[Identifier]: "identifier-uuid",
|
|
[LegacyIdentifier]: "legacyidentifier-uuid",
|
|
};
|
|
let precedenceEl = WebElement.fromJSON(identifierPrecedence);
|
|
ok(precedenceEl instanceof ContentWebElement);
|
|
equal(precedenceEl.uuid, "identifier-uuid");
|
|
|
|
run_next_test();
|
|
});
|
|
|
|
add_test(function test_WebElement_fromJSON_ContentWebWindow() {
|
|
let ref = {[ContentWebWindow.Identifier]: "foo"};
|
|
let win = WebElement.fromJSON(ref);
|
|
ok(win instanceof ContentWebWindow);
|
|
equal(win.uuid, "foo");
|
|
|
|
run_next_test();
|
|
});
|
|
|
|
add_test(function test_WebElement_fromJSON_ContentWebFrame() {
|
|
let ref = {[ContentWebFrame.Identifier]: "foo"};
|
|
let frame = WebElement.fromJSON(ref);
|
|
ok(frame instanceof ContentWebFrame);
|
|
equal(frame.uuid, "foo");
|
|
|
|
run_next_test();
|
|
});
|
|
|
|
add_test(function test_WebElement_fromJSON_ChromeWebElement() {
|
|
let ref = {[ChromeWebElement.Identifier]: "foo"};
|
|
let el = WebElement.fromJSON(ref);
|
|
ok(el instanceof ChromeWebElement);
|
|
equal(el.uuid, "foo");
|
|
|
|
run_next_test();
|
|
});
|
|
|
|
add_test(function test_WebElement_fromJSON_malformed() {
|
|
Assert.throws(() => WebElement.fromJSON({}), /Expected web element reference/);
|
|
Assert.throws(() => WebElement.fromJSON(null), /Expected JSON Object/);
|
|
run_next_test();
|
|
});
|
|
|
|
add_test(function test_WebElement_fromUUID() {
|
|
let xulWebEl = WebElement.fromUUID("foo", "chrome");
|
|
ok(xulWebEl instanceof ChromeWebElement);
|
|
equal(xulWebEl.uuid, "foo");
|
|
|
|
let domWebEl = WebElement.fromUUID("bar", "content");
|
|
ok(domWebEl instanceof ContentWebElement);
|
|
equal(domWebEl.uuid, "bar");
|
|
|
|
Assert.throws(() => WebElement.fromUUID("baz", "bah"), /Unknown context/);
|
|
|
|
run_next_test();
|
|
});
|
|
|
|
add_test(function test_WebElement_isReference() {
|
|
for (let t of [42, true, "foo", [], {}]) {
|
|
ok(!WebElement.isReference(t));
|
|
}
|
|
|
|
ok(WebElement.isReference({[ContentWebElement.Identifier]: "foo"}));
|
|
ok(WebElement.isReference({[ContentWebElement.LegacyIdentifier]: "foo"}));
|
|
ok(WebElement.isReference({[ContentWebWindow.Identifier]: "foo"}));
|
|
ok(WebElement.isReference({[ContentWebFrame.Identifier]: "foo"}));
|
|
ok(WebElement.isReference({[ChromeWebElement.Identifier]: "foo"}));
|
|
|
|
run_next_test();
|
|
});
|
|
|
|
add_test(function test_WebElement_generateUUID() {
|
|
equal(typeof WebElement.generateUUID(), "string");
|
|
run_next_test();
|
|
});
|
|
|
|
add_test(function test_ContentWebElement_toJSON() {
|
|
const {Identifier, LegacyIdentifier} = ContentWebElement;
|
|
|
|
let el = new ContentWebElement("foo");
|
|
let json = el.toJSON();
|
|
|
|
ok(Identifier in json);
|
|
ok(LegacyIdentifier in json);
|
|
equal(json[Identifier], "foo");
|
|
equal(json[LegacyIdentifier], "foo");
|
|
|
|
run_next_test();
|
|
});
|
|
|
|
add_test(function test_ContentWebElement_fromJSON() {
|
|
const {Identifier, LegacyIdentifier} = ContentWebElement;
|
|
|
|
let newEl = ContentWebElement.fromJSON({[Identifier]: "foo"});
|
|
ok(newEl instanceof ContentWebElement);
|
|
equal(newEl.uuid, "foo");
|
|
|
|
let oldEl = ContentWebElement.fromJSON({[LegacyIdentifier]: "foo"});
|
|
ok(oldEl instanceof ContentWebElement);
|
|
equal(oldEl.uuid, "foo");
|
|
|
|
let bothRef = {
|
|
[Identifier]: "identifier-uuid",
|
|
[LegacyIdentifier]: "legacyidentifier-foo",
|
|
};
|
|
let bothEl = ContentWebElement.fromJSON(bothRef);
|
|
ok(bothEl instanceof ContentWebElement);
|
|
equal(bothEl.uuid, "identifier-uuid");
|
|
|
|
Assert.throws(() => ContentWebElement.fromJSON({}), /Expected web element reference/);
|
|
|
|
run_next_test();
|
|
});
|
|
|
|
add_test(function test_ContentWebWindow_toJSON() {
|
|
let win = new ContentWebWindow("foo");
|
|
let json = win.toJSON();
|
|
ok(ContentWebWindow.Identifier in json);
|
|
equal(json[ContentWebWindow.Identifier], "foo");
|
|
|
|
run_next_test();
|
|
});
|
|
|
|
add_test(function test_ContentWebWindow_fromJSON() {
|
|
let ref = {[ContentWebWindow.Identifier]: "foo"};
|
|
let win = ContentWebWindow.fromJSON(ref);
|
|
ok(win instanceof ContentWebWindow);
|
|
equal(win.uuid, "foo");
|
|
|
|
run_next_test();
|
|
});
|
|
|
|
add_test(function test_ContentWebFrame_toJSON() {
|
|
let frame = new ContentWebFrame("foo");
|
|
let json = frame.toJSON();
|
|
ok(ContentWebFrame.Identifier in json);
|
|
equal(json[ContentWebFrame.Identifier], "foo");
|
|
|
|
run_next_test();
|
|
});
|
|
|
|
add_test(function test_ContentWebFrame_fromJSON() {
|
|
let ref = {[ContentWebFrame.Identifier]: "foo"};
|
|
let win = ContentWebFrame.fromJSON(ref);
|
|
ok(win instanceof ContentWebFrame);
|
|
equal(win.uuid, "foo");
|
|
|
|
run_next_test();
|
|
});
|
|
|
|
add_test(function test_ChromeWebElement_toJSON() {
|
|
let el = new ChromeWebElement("foo");
|
|
let json = el.toJSON();
|
|
ok(ChromeWebElement.Identifier in json);
|
|
equal(json[ChromeWebElement.Identifier], "foo");
|
|
|
|
run_next_test();
|
|
});
|
|
|
|
add_test(function test_ChromeWebElement_fromJSON() {
|
|
let ref = {[ChromeWebElement.Identifier]: "foo"};
|
|
let win = ChromeWebElement.fromJSON(ref);
|
|
ok(win instanceof ChromeWebElement);
|
|
equal(win.uuid, "foo");
|
|
|
|
run_next_test();
|
|
});
|