Bug 1409040 - Add element.isSVGElement. r?maja_zf draft
authorAndreas Tolfsen <ato@sny.no>
Mon, 16 Oct 2017 14:25:53 +0100
changeset 682766 cd5f4be9dceeed7da9fdae6f52868b2b72f0c752
parent 682765 3a10d857dfde878336102e8f8a222271020a3f53
child 682767 1fc1c2ed416ce10167cecc5cf4dfae5733ff0cad
push id85136
push userbmo:ato@sny.no
push dateWed, 18 Oct 2017 18:18:02 +0000
reviewersmaja_zf
bugs1409040
milestone58.0a1
Bug 1409040 - Add element.isSVGElement. r?maja_zf MozReview-Commit-ID: 4VCjHCnO3QB
testing/marionette/element.js
testing/marionette/test_element.js
--- a/testing/marionette/element.js
+++ b/testing/marionette/element.js
@@ -14,16 +14,17 @@ const {
   NoSuchElementError,
   StaleElementReferenceError,
 } = Cu.import("chrome://marionette/content/error.js", {});
 const {pprint} = Cu.import("chrome://marionette/content/format.js", {});
 const {PollPromise} = Cu.import("chrome://marionette/content/sync.js", {});
 
 this.EXPORTED_SYMBOLS = ["element"];
 
+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";
 
 /** XUL elements that support checked property. */
 const XUL_CHECKED_ELS = new Set([
   "button",
   "checkbox",
@@ -1060,17 +1061,33 @@ element.scrollIntoView = function(el) {
 element.isDOMElement = function(node) {
   return typeof node == "object" &&
       node !== null &&
       node.nodeType === node.ELEMENT_NODE &&
       node.namespaceURI === XHTMLNS;
 };
 
 /**
- * Ascertains whether <var>node</var> is a XUL- or XBL element.
+ * Ascertains whether <var>node</var> is an SVG element.
+ *
+ * @param {*} node
+ *     Object thought to be an <code>SVGElement</code>.
+ *
+ * @return {boolean}
+ *     True if <var>node</var> is an SVG element, false otherwise.
+ */
+element.isSVGElement = function(node) {
+  return typeof node == "object" &&
+      node !== null &&
+      node.nodeType === node.ELEMENT_NODE &&
+      node.namespaceURI === SVGNS;
+};
+
+/**
+ * Ascertains whether <var>el</var> is a XUL- or XBL element.
  *
  * @param {*} node
  *     Element thought to be a XUL- or XBL element.
  *
  * @return {boolean}
  *     True if <var>node</var> is a XULElement or XBLElement,
  *     false otherwise.
  */
--- a/testing/marionette/test_element.js
+++ b/testing/marionette/test_element.js
@@ -1,16 +1,17 @@
 /* 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;
 
 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;
@@ -44,31 +45,39 @@ class DOMElement extends Element {
       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]"; }
 }
@@ -103,43 +112,59 @@ add_test(function test_isSelected() {
     ok(!element.isSelected(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();
 });