summaryrefslogtreecommitdiff
path: root/static/src/assets/viz/2/goog/dom
diff options
context:
space:
mode:
Diffstat (limited to 'static/src/assets/viz/2/goog/dom')
-rw-r--r--static/src/assets/viz/2/goog/dom/asserts.js311
-rw-r--r--static/src/assets/viz/2/goog/dom/browserfeature.js73
-rw-r--r--static/src/assets/viz/2/goog/dom/dom.js3233
-rw-r--r--static/src/assets/viz/2/goog/dom/htmlelement.js29
-rw-r--r--static/src/assets/viz/2/goog/dom/nodetype.js48
-rw-r--r--static/src/assets/viz/2/goog/dom/safe.js458
-rw-r--r--static/src/assets/viz/2/goog/dom/tagname.js562
-rw-r--r--static/src/assets/viz/2/goog/dom/tags.js41
8 files changed, 0 insertions, 4755 deletions
diff --git a/static/src/assets/viz/2/goog/dom/asserts.js b/static/src/assets/viz/2/goog/dom/asserts.js
deleted file mode 100644
index a8f93ba..0000000
--- a/static/src/assets/viz/2/goog/dom/asserts.js
+++ /dev/null
@@ -1,311 +0,0 @@
-// Copyright 2017 The Closure Library Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS-IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-goog.provide('goog.dom.asserts');
-
-goog.require('goog.asserts');
-
-/**
- * @fileoverview Custom assertions to ensure that an element has the appropriate
- * type.
- *
- * Using a goog.dom.safe wrapper on an object on the incorrect type (via an
- * incorrect static type cast) can result in security bugs: For instance,
- * g.d.s.setAnchorHref ensures that the URL assigned to the .href attribute
- * satisfies the SafeUrl contract, i.e., is safe to dereference as a hyperlink.
- * However, the value assigned to a HTMLLinkElement's .href property requires
- * the stronger TrustedResourceUrl contract, since it can refer to a stylesheet.
- * Thus, using g.d.s.setAnchorHref on an (incorrectly statically typed) object
- * of type HTMLLinkElement can result in a security vulnerability.
- * Assertions of the correct run-time type help prevent such incorrect use.
- *
- * In some cases, code using the DOM API is tested using mock objects (e.g., a
- * plain object such as {'href': url} instead of an actual Location object).
- * To allow such mocking, the assertions permit objects of types that are not
- * relevant DOM API objects at all (for instance, not Element or Location).
- *
- * Note that instanceof checks don't work straightforwardly in older versions of
- * IE, or across frames (see,
- * http://stackoverflow.com/questions/384286/javascript-isdom-how-do-you-check-if-a-javascript-object-is-a-dom-object,
- * http://stackoverflow.com/questions/26248599/instanceof-htmlelement-in-iframe-is-not-element-or-object).
- *
- * Hence, these assertions may pass vacuously in such scenarios. The resulting
- * risk of security bugs is limited by the following factors:
- * - A bug can only arise in scenarios involving incorrect static typing (the
- * wrapper methods are statically typed to demand objects of the appropriate,
- * precise type).
- * - Typically, code is tested and exercised in multiple browsers.
- */
-
-/**
- * Asserts that a given object is a Location.
- *
- * To permit this assertion to pass in the context of tests where DOM APIs might
- * be mocked, also accepts any other type except for subtypes of {!Element}.
- * This is to ensure that, for instance, HTMLLinkElement is not being used in
- * place of a Location, since this could result in security bugs due to stronger
- * contracts required for assignments to the href property of the latter.
- *
- * @param {?Object} o The object whose type to assert.
- * @return {!Location}
- */
-goog.dom.asserts.assertIsLocation = function(o) {
- if (goog.asserts.ENABLE_ASSERTS) {
- var win = goog.dom.asserts.getWindow_(o);
- if (typeof win.Location != 'undefined' &&
- typeof win.Element != 'undefined') {
- goog.asserts.assert(
- o && (o instanceof win.Location || !(o instanceof win.Element)),
- 'Argument is not a Location (or a non-Element mock); got: %s',
- goog.dom.asserts.debugStringForType_(o));
- }
- }
- return /** @type {!Location} */ (o);
-};
-
-/**
- * Asserts that a given object is a HTMLAnchorElement.
- *
- * To permit this assertion to pass in the context of tests where elements might
- * be mocked, also accepts objects that are not of type Location nor a subtype
- * of Element.
- *
- * @param {?Object} o The object whose type to assert.
- * @return {!HTMLAnchorElement}
- */
-goog.dom.asserts.assertIsHTMLAnchorElement = function(o) {
- if (goog.asserts.ENABLE_ASSERTS) {
- var win = goog.dom.asserts.getWindow_(o);
- if (typeof win.HTMLAnchorElement != 'undefined' &&
- typeof win.Location != 'undefined' &&
- typeof win.Element != 'undefined') {
- goog.asserts.assert(
- o &&
- (o instanceof win.HTMLAnchorElement ||
- !((o instanceof win.Location) || (o instanceof win.Element))),
- 'Argument is not a HTMLAnchorElement (or a non-Element mock); ' +
- 'got: %s',
- goog.dom.asserts.debugStringForType_(o));
- }
- }
- return /** @type {!HTMLAnchorElement} */ (o);
-};
-
-/**
- * Asserts that a given object is a HTMLLinkElement.
- *
- * To permit this assertion to pass in the context of tests where elements might
- * be mocked, also accepts objects that are not a subtype of Element.
- *
- * @param {?Object} o The object whose type to assert.
- * @return {!HTMLLinkElement}
- */
-goog.dom.asserts.assertIsHTMLLinkElement = function(o) {
- if (goog.asserts.ENABLE_ASSERTS) {
- var win = goog.dom.asserts.getWindow_(o);
- if (typeof win.HTMLLinkElement != 'undefined' &&
- typeof win.Location != 'undefined' &&
- typeof win.Element != 'undefined') {
- goog.asserts.assert(
- o &&
- (o instanceof win.HTMLLinkElement ||
- !((o instanceof win.Location) || (o instanceof win.Element))),
- 'Argument is not a HTMLLinkElement (or a non-Element mock); got: %s',
- goog.dom.asserts.debugStringForType_(o));
- }
- }
- return /** @type {!HTMLLinkElement} */ (o);
-};
-
-/**
- * Asserts that a given object is a HTMLImageElement.
- *
- * To permit this assertion to pass in the context of tests where elements might
- * be mocked, also accepts objects that are not a subtype of Element.
- *
- * @param {?Object} o The object whose type to assert.
- * @return {!HTMLImageElement}
- */
-goog.dom.asserts.assertIsHTMLImageElement = function(o) {
- if (goog.asserts.ENABLE_ASSERTS) {
- var win = goog.dom.asserts.getWindow_(o);
- if (typeof win.HTMLImageElement != 'undefined' &&
- typeof win.Element != 'undefined') {
- goog.asserts.assert(
- o &&
- (o instanceof win.HTMLImageElement ||
- !(o instanceof win.Element)),
- 'Argument is not a HTMLImageElement (or a non-Element mock); got: %s',
- goog.dom.asserts.debugStringForType_(o));
- }
- }
- return /** @type {!HTMLImageElement} */ (o);
-};
-
-/**
- * Asserts that a given object is a HTMLEmbedElement.
- *
- * To permit this assertion to pass in the context of tests where elements might
- * be mocked, also accepts objects that are not a subtype of Element.
- *
- * @param {?Object} o The object whose type to assert.
- * @return {!HTMLEmbedElement}
- */
-goog.dom.asserts.assertIsHTMLEmbedElement = function(o) {
- if (goog.asserts.ENABLE_ASSERTS) {
- var win = goog.dom.asserts.getWindow_(o);
- if (typeof win.HTMLEmbedElement != 'undefined' &&
- typeof win.Element != 'undefined') {
- goog.asserts.assert(
- o &&
- (o instanceof win.HTMLEmbedElement ||
- !(o instanceof win.Element)),
- 'Argument is not a HTMLEmbedElement (or a non-Element mock); got: %s',
- goog.dom.asserts.debugStringForType_(o));
- }
- }
- return /** @type {!HTMLEmbedElement} */ (o);
-};
-
-/**
- * Asserts that a given object is a HTMLFrameElement.
- *
- * To permit this assertion to pass in the context of tests where elements might
- * be mocked, also accepts objects that are not a subtype of Element.
- *
- * @param {?Object} o The object whose type to assert.
- * @return {!HTMLFrameElement}
- */
-goog.dom.asserts.assertIsHTMLFrameElement = function(o) {
- if (goog.asserts.ENABLE_ASSERTS) {
- var win = goog.dom.asserts.getWindow_(o);
- if (typeof win.HTMLFrameElement != 'undefined' &&
- typeof win.Element != 'undefined') {
- goog.asserts.assert(
- o &&
- (o instanceof win.HTMLFrameElement ||
- !(o instanceof win.Element)),
- 'Argument is not a HTMLFrameElement (or a non-Element mock); got: %s',
- goog.dom.asserts.debugStringForType_(o));
- }
- }
- return /** @type {!HTMLFrameElement} */ (o);
-};
-
-/**
- * Asserts that a given object is a HTMLIFrameElement.
- *
- * To permit this assertion to pass in the context of tests where elements might
- * be mocked, also accepts objects that are not a subtype of Element.
- *
- * @param {?Object} o The object whose type to assert.
- * @return {!HTMLIFrameElement}
- */
-goog.dom.asserts.assertIsHTMLIFrameElement = function(o) {
- if (goog.asserts.ENABLE_ASSERTS) {
- var win = goog.dom.asserts.getWindow_(o);
- if (typeof win.HTMLIFrameElement != 'undefined' &&
- typeof win.Element != 'undefined') {
- goog.asserts.assert(
- o &&
- (o instanceof win.HTMLIFrameElement ||
- !(o instanceof win.Element)),
- 'Argument is not a HTMLIFrameElement (or a non-Element mock); ' +
- 'got: %s',
- goog.dom.asserts.debugStringForType_(o));
- }
- }
- return /** @type {!HTMLIFrameElement} */ (o);
-};
-
-/**
- * Asserts that a given object is a HTMLObjectElement.
- *
- * To permit this assertion to pass in the context of tests where elements might
- * be mocked, also accepts objects that are not a subtype of Element.
- *
- * @param {?Object} o The object whose type to assert.
- * @return {!HTMLObjectElement}
- */
-goog.dom.asserts.assertIsHTMLObjectElement = function(o) {
- if (goog.asserts.ENABLE_ASSERTS) {
- var win = goog.dom.asserts.getWindow_(o);
- if (typeof win.HTMLObjectElement != 'undefined' &&
- typeof win.Element != 'undefined') {
- goog.asserts.assert(
- o &&
- (o instanceof win.HTMLObjectElement ||
- !(o instanceof win.Element)),
- 'Argument is not a HTMLObjectElement (or a non-Element mock); ' +
- 'got: %s',
- goog.dom.asserts.debugStringForType_(o));
- }
- }
- return /** @type {!HTMLObjectElement} */ (o);
-};
-
-/**
- * Asserts that a given object is a HTMLScriptElement.
- *
- * To permit this assertion to pass in the context of tests where elements might
- * be mocked, also accepts objects that are not a subtype of Element.
- *
- * @param {?Object} o The object whose type to assert.
- * @return {!HTMLScriptElement}
- */
-goog.dom.asserts.assertIsHTMLScriptElement = function(o) {
- if (goog.asserts.ENABLE_ASSERTS) {
- var win = goog.dom.asserts.getWindow_(o);
- if (typeof win.HTMLScriptElement != 'undefined' &&
- typeof win.Element != 'undefined') {
- goog.asserts.assert(
- o &&
- (o instanceof win.HTMLScriptElement ||
- !(o instanceof win.Element)),
- 'Argument is not a HTMLScriptElement (or a non-Element mock); ' +
- 'got: %s',
- goog.dom.asserts.debugStringForType_(o));
- }
- }
- return /** @type {!HTMLScriptElement} */ (o);
-};
-
-/**
- * Returns a string representation of a value's type.
- *
- * @param {*} value An object, or primitive.
- * @return {string} The best display name for the value.
- * @private
- */
-goog.dom.asserts.debugStringForType_ = function(value) {
- if (goog.isObject(value)) {
- return value.constructor.displayName || value.constructor.name ||
- Object.prototype.toString.call(value);
- } else {
- return value === undefined ? 'undefined' :
- value === null ? 'null' : typeof value;
- }
-};
-
-/**
- * Gets window of element.
- * @param {?Object} o
- * @return {!Window}
- * @private
- */
-goog.dom.asserts.getWindow_ = function(o) {
- var doc = o && o.ownerDocument;
- var win = doc && /** @type {?Window} */ (doc.defaultView || doc.parentWindow);
- return win || /** @type {!Window} */ (goog.global);
-};
diff --git a/static/src/assets/viz/2/goog/dom/browserfeature.js b/static/src/assets/viz/2/goog/dom/browserfeature.js
deleted file mode 100644
index 1172166..0000000
--- a/static/src/assets/viz/2/goog/dom/browserfeature.js
+++ /dev/null
@@ -1,73 +0,0 @@
-// Copyright 2010 The Closure Library Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS-IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-/**
- * @fileoverview Browser capability checks for the dom package.
- *
- */
-
-
-goog.provide('goog.dom.BrowserFeature');
-
-goog.require('goog.userAgent');
-
-
-/**
- * Enum of browser capabilities.
- * @enum {boolean}
- */
-goog.dom.BrowserFeature = {
- /**
- * Whether attributes 'name' and 'type' can be added to an element after it's
- * created. False in Internet Explorer prior to version 9.
- */
- CAN_ADD_NAME_OR_TYPE_ATTRIBUTES:
- !goog.userAgent.IE || goog.userAgent.isDocumentModeOrHigher(9),
-
- /**
- * Whether we can use element.children to access an element's Element
- * children. Available since Gecko 1.9.1, IE 9. (IE<9 also includes comment
- * nodes in the collection.)
- */
- CAN_USE_CHILDREN_ATTRIBUTE: !goog.userAgent.GECKO && !goog.userAgent.IE ||
- goog.userAgent.IE && goog.userAgent.isDocumentModeOrHigher(9) ||
- goog.userAgent.GECKO && goog.userAgent.isVersionOrHigher('1.9.1'),
-
- /**
- * Opera, Safari 3, and Internet Explorer 9 all support innerText but they
- * include text nodes in script and style tags. Not document-mode-dependent.
- */
- CAN_USE_INNER_TEXT:
- (goog.userAgent.IE && !goog.userAgent.isVersionOrHigher('9')),
-
- /**
- * MSIE, Opera, and Safari>=4 support element.parentElement to access an
- * element's parent if it is an Element.
- */
- CAN_USE_PARENT_ELEMENT_PROPERTY:
- goog.userAgent.IE || goog.userAgent.OPERA || goog.userAgent.WEBKIT,
-
- /**
- * Whether NoScope elements need a scoped element written before them in
- * innerHTML.
- * MSDN: http://msdn.microsoft.com/en-us/library/ms533897(VS.85).aspx#1
- */
- INNER_HTML_NEEDS_SCOPED_ELEMENT: goog.userAgent.IE,
-
- /**
- * Whether we use legacy IE range API.
- */
- LEGACY_IE_RANGES:
- goog.userAgent.IE && !goog.userAgent.isDocumentModeOrHigher(9)
-};
diff --git a/static/src/assets/viz/2/goog/dom/dom.js b/static/src/assets/viz/2/goog/dom/dom.js
deleted file mode 100644
index 919a0b6..0000000
--- a/static/src/assets/viz/2/goog/dom/dom.js
+++ /dev/null
@@ -1,3233 +0,0 @@
-// Copyright 2006 The Closure Library Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS-IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-/**
- * @fileoverview Utilities for manipulating the browser's Document Object Model
- * Inspiration taken *heavily* from mochikit (http://mochikit.com/).
- *
- * You can use {@link goog.dom.DomHelper} to create new dom helpers that refer
- * to a different document object. This is useful if you are working with
- * frames or multiple windows.
- *
- * @author arv@google.com (Erik Arvidsson)
- */
-
-
-// TODO(arv): Rename/refactor getTextContent and getRawTextContent. The problem
-// is that getTextContent should mimic the DOM3 textContent. We should add a
-// getInnerText (or getText) which tries to return the visible text, innerText.
-
-
-goog.provide('goog.dom');
-goog.provide('goog.dom.Appendable');
-goog.provide('goog.dom.DomHelper');
-
-goog.require('goog.array');
-goog.require('goog.asserts');
-goog.require('goog.dom.BrowserFeature');
-goog.require('goog.dom.NodeType');
-goog.require('goog.dom.TagName');
-goog.require('goog.dom.safe');
-goog.require('goog.html.SafeHtml');
-goog.require('goog.html.uncheckedconversions');
-goog.require('goog.math.Coordinate');
-goog.require('goog.math.Size');
-goog.require('goog.object');
-goog.require('goog.string');
-goog.require('goog.string.Unicode');
-goog.require('goog.userAgent');
-
-
-/**
- * @define {boolean} Whether we know at compile time that the browser is in
- * quirks mode.
- */
-goog.define('goog.dom.ASSUME_QUIRKS_MODE', false);
-
-
-/**
- * @define {boolean} Whether we know at compile time that the browser is in
- * standards compliance mode.
- */
-goog.define('goog.dom.ASSUME_STANDARDS_MODE', false);
-
-
-/**
- * Whether we know the compatibility mode at compile time.
- * @type {boolean}
- * @private
- */
-goog.dom.COMPAT_MODE_KNOWN_ =
- goog.dom.ASSUME_QUIRKS_MODE || goog.dom.ASSUME_STANDARDS_MODE;
-
-
-/**
- * Gets the DomHelper object for the document where the element resides.
- * @param {(Node|Window)=} opt_element If present, gets the DomHelper for this
- * element.
- * @return {!goog.dom.DomHelper} The DomHelper.
- */
-goog.dom.getDomHelper = function(opt_element) {
- return opt_element ?
- new goog.dom.DomHelper(goog.dom.getOwnerDocument(opt_element)) :
- (goog.dom.defaultDomHelper_ ||
- (goog.dom.defaultDomHelper_ = new goog.dom.DomHelper()));
-};
-
-
-/**
- * Cached default DOM helper.
- * @type {!goog.dom.DomHelper|undefined}
- * @private
- */
-goog.dom.defaultDomHelper_;
-
-
-/**
- * Gets the document object being used by the dom library.
- * @return {!Document} Document object.
- */
-goog.dom.getDocument = function() {
- return document;
-};
-
-
-/**
- * Gets an element from the current document by element id.
- *
- * If an Element is passed in, it is returned.
- *
- * @param {string|Element} element Element ID or a DOM node.
- * @return {Element} The element with the given ID, or the node passed in.
- */
-goog.dom.getElement = function(element) {
- return goog.dom.getElementHelper_(document, element);
-};
-
-
-/**
- * Gets an element by id from the given document (if present).
- * If an element is given, it is returned.
- * @param {!Document} doc
- * @param {string|Element} element Element ID or a DOM node.
- * @return {Element} The resulting element.
- * @private
- */
-goog.dom.getElementHelper_ = function(doc, element) {
- return goog.isString(element) ? doc.getElementById(element) : element;
-};
-
-
-/**
- * Gets an element by id, asserting that the element is found.
- *
- * This is used when an element is expected to exist, and should fail with
- * an assertion error if it does not (if assertions are enabled).
- *
- * @param {string} id Element ID.
- * @return {!Element} The element with the given ID, if it exists.
- */
-goog.dom.getRequiredElement = function(id) {
- return goog.dom.getRequiredElementHelper_(document, id);
-};
-
-
-/**
- * Helper function for getRequiredElementHelper functions, both static and
- * on DomHelper. Asserts the element with the given id exists.
- * @param {!Document} doc
- * @param {string} id
- * @return {!Element} The element with the given ID, if it exists.
- * @private
- */
-goog.dom.getRequiredElementHelper_ = function(doc, id) {
- // To prevent users passing in Elements as is permitted in getElement().
- goog.asserts.assertString(id);
- var element = goog.dom.getElementHelper_(doc, id);
- element =
- goog.asserts.assertElement(element, 'No element found with id: ' + id);
- return element;
-};
-
-
-/**
- * Alias for getElement.
- * @param {string|Element} element Element ID or a DOM node.
- * @return {Element} The element with the given ID, or the node passed in.
- * @deprecated Use {@link goog.dom.getElement} instead.
- */
-goog.dom.$ = goog.dom.getElement;
-
-
-/**
- * Gets elements by tag name.
- * @param {!goog.dom.TagName<T>} tagName
- * @param {(!Document|!Element)=} opt_parent Parent element or document where to
- * look for elements. Defaults to document.
- * @return {!NodeList<R>} List of elements. The members of the list are
- * {!Element} if tagName is not a member of goog.dom.TagName or more
- * specific types if it is (e.g. {!HTMLAnchorElement} for
- * goog.dom.TagName.A).
- * @template T
- * @template R := cond(isUnknown(T), 'Element', T) =:
- */
-goog.dom.getElementsByTagName = function(tagName, opt_parent) {
- var parent = opt_parent || document;
- return parent.getElementsByTagName(String(tagName));
-};
-
-
-/**
- * Looks up elements by both tag and class name, using browser native functions
- * ({@code querySelectorAll}, {@code getElementsByTagName} or
- * {@code getElementsByClassName}) where possible. This function
- * is a useful, if limited, way of collecting a list of DOM elements
- * with certain characteristics. {@code goog.dom.query} offers a
- * more powerful and general solution which allows matching on CSS3
- * selector expressions, but at increased cost in code size. If all you
- * need is particular tags belonging to a single class, this function
- * is fast and sleek.
- *
- * Note that tag names are case sensitive in the SVG namespace, and this
- * function converts opt_tag to uppercase for comparisons. For queries in the
- * SVG namespace you should use querySelector or querySelectorAll instead.
- * https://bugzilla.mozilla.org/show_bug.cgi?id=963870
- * https://bugs.webkit.org/show_bug.cgi?id=83438
- *
- * @see {goog.dom.query}
- *
- * @param {(string|?goog.dom.TagName<T>)=} opt_tag Element tag name.
- * @param {?string=} opt_class Optional class name.
- * @param {(Document|Element)=} opt_el Optional element to look in.
- * @return {!IArrayLike<R>} Array-like list of elements (only a length property
- * and numerical indices are guaranteed to exist). The members of the array
- * are {!Element} if opt_tag is not a member of goog.dom.TagName or more
- * specific types if it is (e.g. {!HTMLAnchorElement} for
- * goog.dom.TagName.A).
- * @template T
- * @template R := cond(isUnknown(T), 'Element', T) =:
- */
-goog.dom.getElementsByTagNameAndClass = function(opt_tag, opt_class, opt_el) {
- return goog.dom.getElementsByTagNameAndClass_(
- document, opt_tag, opt_class, opt_el);
-};
-
-
-/**
- * Gets the first element matching the tag and the class.
- *
- * @param {(string|?goog.dom.TagName<T>)=} opt_tag Element tag name.
- * @param {?string=} opt_class Optional class name.
- * @param {(Document|Element)=} opt_el Optional element to look in.
- * @return {?R} Reference to a DOM node. The return type is {?Element} if
- * tagName is a string or a more specific type if it is a member of
- * goog.dom.TagName (e.g. {?HTMLAnchorElement} for goog.dom.TagName.A).
- * @template T
- * @template R := cond(isUnknown(T), 'Element', T) =:
- */
-goog.dom.getElementByTagNameAndClass = function(opt_tag, opt_class, opt_el) {
- return goog.dom.getElementByTagNameAndClass_(
- document, opt_tag, opt_class, opt_el);
-};
-
-
-/**
- * Returns a static, array-like list of the elements with the provided
- * className.
- * @see {goog.dom.query}
- * @param {string} className the name of the class to look for.
- * @param {(Document|Element)=} opt_el Optional element to look in.
- * @return {!IArrayLike<!Element>} The items found with the class name provided.
- */
-goog.dom.getElementsByClass = function(className, opt_el) {
- var parent = opt_el || document;
- if (goog.dom.canUseQuerySelector_(parent)) {
- return parent.querySelectorAll('.' + className);
- }
- return goog.dom.getElementsByTagNameAndClass_(
- document, '*', className, opt_el);
-};
-
-
-/**
- * Returns the first element with the provided className.
- * @see {goog.dom.query}
- * @param {string} className the name of the class to look for.
- * @param {Element|Document=} opt_el Optional element to look in.
- * @return {Element} The first item with the class name provided.
- */
-goog.dom.getElementByClass = function(className, opt_el) {
- var parent = opt_el || document;
- var retVal = null;
- if (parent.getElementsByClassName) {
- retVal = parent.getElementsByClassName(className)[0];
- } else {
- retVal =
- goog.dom.getElementByTagNameAndClass_(document, '*', className, opt_el);
- }
- return retVal || null;
-};
-
-
-/**
- * Ensures an element with the given className exists, and then returns the
- * first element with the provided className.
- * @see {goog.dom.query}
- * @param {string} className the name of the class to look for.
- * @param {!Element|!Document=} opt_root Optional element or document to look
- * in.
- * @return {!Element} The first item with the class name provided.
- * @throws {goog.asserts.AssertionError} Thrown if no element is found.
- */
-goog.dom.getRequiredElementByClass = function(className, opt_root) {
- var retValue = goog.dom.getElementByClass(className, opt_root);
- return goog.asserts.assert(
- retValue, 'No element found with className: ' + className);
-};
-
-
-/**
- * Prefer the standardized (http://www.w3.org/TR/selectors-api/), native and
- * fast W3C Selectors API.
- * @param {!(Element|Document)} parent The parent document object.
- * @return {boolean} whether or not we can use parent.querySelector* APIs.
- * @private
- */
-goog.dom.canUseQuerySelector_ = function(parent) {
- return !!(parent.querySelectorAll && parent.querySelector);
-};
-
-
-/**
- * Helper for {@code getElementsByTagNameAndClass}.
- * @param {!Document} doc The document to get the elements in.
- * @param {(string|?goog.dom.TagName<T>)=} opt_tag Element tag name.
- * @param {?string=} opt_class Optional class name.
- * @param {(Document|Element)=} opt_el Optional element to look in.
- * @return {!IArrayLike<R>} Array-like list of elements (only a length property
- * and numerical indices are guaranteed to exist). The members of the array
- * are {!Element} if opt_tag is not a member of goog.dom.TagName or more
- * specific types if it is (e.g. {!HTMLAnchorElement} for
- * goog.dom.TagName.A).
- * @template T
- * @template R := cond(isUnknown(T), 'Element', T) =:
- * @private
- */
-goog.dom.getElementsByTagNameAndClass_ = function(
- doc, opt_tag, opt_class, opt_el) {
- var parent = opt_el || doc;
- var tagName =
- (opt_tag && opt_tag != '*') ? String(opt_tag).toUpperCase() : '';
-
- if (goog.dom.canUseQuerySelector_(parent) && (tagName || opt_class)) {
- var query = tagName + (opt_class ? '.' + opt_class : '');
- return parent.querySelectorAll(query);
- }
-
- // Use the native getElementsByClassName if available, under the assumption
- // that even when the tag name is specified, there will be fewer elements to
- // filter through when going by class than by tag name
- if (opt_class && parent.getElementsByClassName) {
- var els = parent.getElementsByClassName(opt_class);
-
- if (tagName) {
- var arrayLike = {};
- var len = 0;
-
- // Filter for specific tags if requested.
- for (var i = 0, el; el = els[i]; i++) {
- if (tagName == el.nodeName) {
- arrayLike[len++] = el;
- }
- }
- arrayLike.length = len;
-
- return /** @type {!IArrayLike<!Element>} */ (arrayLike);
- } else {
- return els;
- }
- }
-
- var els = parent.getElementsByTagName(tagName || '*');
-
- if (opt_class) {
- var arrayLike = {};
- var len = 0;
- for (var i = 0, el; el = els[i]; i++) {
- var className = el.className;
- // Check if className has a split function since SVG className does not.
- if (typeof className.split == 'function' &&
- goog.array.contains(className.split(/\s+/), opt_class)) {
- arrayLike[len++] = el;
- }
- }
- arrayLike.length = len;
- return /** @type {!IArrayLike<!Element>} */ (arrayLike);
- } else {
- return els;
- }
-};
-
-
-/**
- * Helper for goog.dom.getElementByTagNameAndClass.
- *
- * @param {!Document} doc The document to get the elements in.
- * @param {(string|?goog.dom.TagName<T>)=} opt_tag Element tag name.
- * @param {?string=} opt_class Optional class name.
- * @param {(Document|Element)=} opt_el Optional element to look in.
- * @return {?R} Reference to a DOM node. The return type is {?Element} if
- * tagName is a string or a more specific type if it is a member of
- * goog.dom.TagName (e.g. {?HTMLAnchorElement} for goog.dom.TagName.A).
- * @template T
- * @template R := cond(isUnknown(T), 'Element', T) =:
- * @private
- */
-goog.dom.getElementByTagNameAndClass_ = function(
- doc, opt_tag, opt_class, opt_el) {
- var parent = opt_el || doc;
- var tag = (opt_tag && opt_tag != '*') ? String(opt_tag).toUpperCase() : '';
- if (goog.dom.canUseQuerySelector_(parent) && (tag || opt_class)) {
- return parent.querySelector(tag + (opt_class ? '.' + opt_class : ''));
- }
- var elements =
- goog.dom.getElementsByTagNameAndClass_(doc, opt_tag, opt_class, opt_el);
- return elements[0] || null;
-};
-
-
-
-/**
- * Alias for {@code getElementsByTagNameAndClass}.
- * @param {(string|?goog.dom.TagName<T>)=} opt_tag Element tag name.
- * @param {?string=} opt_class Optional class name.
- * @param {Element=} opt_el Optional element to look in.
- * @return {!IArrayLike<R>} Array-like list of elements (only a length property
- * and numerical indices are guaranteed to exist). The members of the array
- * are {!Element} if opt_tag is not a member of goog.dom.TagName or more
- * specific types if it is (e.g. {!HTMLAnchorElement} for
- * goog.dom.TagName.A).
- * @template T
- * @template R := cond(isUnknown(T), 'Element', T) =:
- * @deprecated Use {@link goog.dom.getElementsByTagNameAndClass} instead.
- */
-goog.dom.$$ = goog.dom.getElementsByTagNameAndClass;
-
-
-/**
- * Sets multiple properties, and sometimes attributes, on an element. Note that
- * properties are simply object properties on the element instance, while
- * attributes are visible in the DOM. Many properties map to attributes with the
- * same names, some with different names, and there are also unmappable cases.
- *
- * This method sets properties by default (which means that custom attributes
- * are not supported). These are the exeptions (some of which is legacy):
- * - "style": Even though this is an attribute name, it is translated to a
- * property, "style.cssText". Note that this property sanitizes and formats
- * its value, unlike the attribute.
- * - "class": This is an attribute name, it is translated to the "className"
- * property.
- * - "for": This is an attribute name, it is translated to the "htmlFor"
- * property.
- * - Entries in {@see goog.dom.DIRECT_ATTRIBUTE_MAP_} are set as attributes,
- * this is probably due to browser quirks.
- * - "aria-*", "data-*": Always set as attributes, they have no property
- * counterparts.
- *
- * @param {Element} element DOM node to set properties on.
- * @param {Object} properties Hash of property:value pairs.
- * Property values can be strings or goog.string.TypedString values (such as
- * goog.html.SafeUrl).
- */
-goog.dom.setProperties = function(element, properties) {
- goog.object.forEach(properties, function(val, key) {
- if (val && val.implementsGoogStringTypedString) {
- val = val.getTypedStringValue();
- }
- if (key == 'style') {
- element.style.cssText = val;
- } else if (key == 'class') {
- element.className = val;
- } else if (key == 'for') {
- element.htmlFor = val;
- } else if (goog.dom.DIRECT_ATTRIBUTE_MAP_.hasOwnProperty(key)) {
- element.setAttribute(goog.dom.DIRECT_ATTRIBUTE_MAP_[key], val);
- } else if (
- goog.string.startsWith(key, 'aria-') ||
- goog.string.startsWith(key, 'data-')) {
- element.setAttribute(key, val);
- } else {
- element[key] = val;
- }
- });
-};
-
-
-/**
- * Map of attributes that should be set using
- * element.setAttribute(key, val) instead of element[key] = val. Used
- * by goog.dom.setProperties.
- *
- * @private {!Object<string, string>}
- * @const
- */
-goog.dom.DIRECT_ATTRIBUTE_MAP_ = {
- 'cellpadding': 'cellPadding',
- 'cellspacing': 'cellSpacing',
- 'colspan': 'colSpan',
- 'frameborder': 'frameBorder',
- 'height': 'height',
- 'maxlength': 'maxLength',
- 'nonce': 'nonce',
- 'role': 'role',
- 'rowspan': 'rowSpan',
- 'type': 'type',
- 'usemap': 'useMap',
- 'valign': 'vAlign',
- 'width': 'width'
-};
-
-
-/**
- * Gets the dimensions of the viewport.
- *
- * Gecko Standards mode:
- * docEl.clientWidth Width of viewport excluding scrollbar.
- * win.innerWidth Width of viewport including scrollbar.
- * body.clientWidth Width of body element.
- *
- * docEl.clientHeight Height of viewport excluding scrollbar.
- * win.innerHeight Height of viewport including scrollbar.
- * body.clientHeight Height of document.
- *
- * Gecko Backwards compatible mode:
- * docEl.clientWidth Width of viewport excluding scrollbar.
- * win.innerWidth Width of viewport including scrollbar.
- * body.clientWidth Width of viewport excluding scrollbar.
- *
- * docEl.clientHeight Height of document.
- * win.innerHeight Height of viewport including scrollbar.
- * body.clientHeight Height of viewport excluding scrollbar.
- *
- * IE6/7 Standards mode:
- * docEl.clientWidth Width of viewport excluding scrollbar.
- * win.innerWidth Undefined.
- * body.clientWidth Width of body element.
- *
- * docEl.clientHeight Height of viewport excluding scrollbar.
- * win.innerHeight Undefined.
- * body.clientHeight Height of document element.
- *
- * IE5 + IE6/7 Backwards compatible mode:
- * docEl.clientWidth 0.
- * win.innerWidth Undefined.
- * body.clientWidth Width of viewport excluding scrollbar.
- *
- * docEl.clientHeight 0.
- * win.innerHeight Undefined.
- * body.clientHeight Height of viewport excluding scrollbar.
- *
- * Opera 9 Standards and backwards compatible mode:
- * docEl.clientWidth Width of viewport excluding scrollbar.
- * win.innerWidth Width of viewport including scrollbar.
- * body.clientWidth Width of viewport excluding scrollbar.
- *
- * docEl.clientHeight Height of document.
- * win.innerHeight Height of viewport including scrollbar.
- * body.clientHeight Height of viewport excluding scrollbar.
- *
- * WebKit:
- * Safari 2
- * docEl.clientHeight Same as scrollHeight.
- * docEl.clientWidth Same as innerWidth.
- * win.innerWidth Width of viewport excluding scrollbar.
- * win.innerHeight Height of the viewport including scrollbar.
- * frame.innerHeight Height of the viewport exluding scrollbar.
- *
- * Safari 3 (tested in 522)
- *
- * docEl.clientWidth Width of viewport excluding scrollbar.
- * docEl.clientHeight Height of viewport excluding scrollbar in strict mode.
- * body.clientHeight Height of viewport excluding scrollbar in quirks mode.
- *
- * @param {Window=} opt_window Optional window element to test.
- * @return {!goog.math.Size} Object with values 'width' and 'height'.
- */
-goog.dom.getViewportSize = function(opt_window) {
- // TODO(arv): This should not take an argument
- return goog.dom.getViewportSize_(opt_window || window);
-};
-
-
-/**
- * Helper for {@code getViewportSize}.
- * @param {Window} win The window to get the view port size for.
- * @return {!goog.math.Size} Object with values 'width' and 'height'.
- * @private
- */
-goog.dom.getViewportSize_ = function(win) {
- var doc = win.document;
- var el = goog.dom.isCss1CompatMode_(doc) ? doc.documentElement : doc.body;
- return new goog.math.Size(el.clientWidth, el.clientHeight);
-};
-
-
-/**
- * Calculates the height of the document.
- *
- * @return {number} The height of the current document.
- */
-goog.dom.getDocumentHeight = function() {
- return goog.dom.getDocumentHeight_(window);
-};
-
-/**
- * Calculates the height of the document of the given window.
- *
- * @param {!Window} win The window whose document height to retrieve.
- * @return {number} The height of the document of the given window.
- */
-goog.dom.getDocumentHeightForWindow = function(win) {
- return goog.dom.getDocumentHeight_(win);
-};
-
-/**
- * Calculates the height of the document of the given window.
- *
- * Function code copied from the opensocial gadget api:
- * gadgets.window.adjustHeight(opt_height)
- *
- * @private
- * @param {!Window} win The window whose document height to retrieve.
- * @return {number} The height of the document of the given window.
- */
-goog.dom.getDocumentHeight_ = function(win) {
- // NOTE(eae): This method will return the window size rather than the document
- // size in webkit quirks mode.
- var doc = win.document;
- var height = 0;
-
- if (doc) {
- // Calculating inner content height is hard and different between
- // browsers rendering in Strict vs. Quirks mode. We use a combination of
- // three properties within document.body and document.documentElement:
- // - scrollHeight
- // - offsetHeight
- // - clientHeight
- // These values differ significantly between browsers and rendering modes.
- // But there are patterns. It just takes a lot of time and persistence
- // to figure out.
-
- var body = doc.body;
- var docEl = /** @type {!HTMLElement} */ (doc.documentElement);
- if (!(docEl && body)) {
- return 0;
- }
-
- // Get the height of the viewport
- var vh = goog.dom.getViewportSize_(win).height;
- if (goog.dom.isCss1CompatMode_(doc) && docEl.scrollHeight) {
- // In Strict mode:
- // The inner content height is contained in either:
- // document.documentElement.scrollHeight
- // document.documentElement.offsetHeight
- // Based on studying the values output by different browsers,
- // use the value that's NOT equal to the viewport height found above.
- height =
- docEl.scrollHeight != vh ? docEl.scrollHeight : docEl.offsetHeight;
- } else {
- // In Quirks mode:
- // documentElement.clientHeight is equal to documentElement.offsetHeight
- // except in IE. In most browsers, document.documentElement can be used
- // to calculate the inner content height.
- // However, in other browsers (e.g. IE), document.body must be used
- // instead. How do we know which one to use?
- // If document.documentElement.clientHeight does NOT equal
- // document.documentElement.offsetHeight, then use document.body.
- var sh = docEl.scrollHeight;
- var oh = docEl.offsetHeight;
- if (docEl.clientHeight != oh) {
- sh = body.scrollHeight;
- oh = body.offsetHeight;
- }
-
- // Detect whether the inner content height is bigger or smaller
- // than the bounding box (viewport). If bigger, take the larger
- // value. If smaller, take the smaller value.
- if (sh > vh) {
- // Content is larger
- height = sh > oh ? sh : oh;
- } else {
- // Content is smaller
- height = sh < oh ? sh : oh;
- }
- }
- }
-
- return height;
-};
-
-
-/**
- * Gets the page scroll distance as a coordinate object.
- *
- * @param {Window=} opt_window Optional window element to test.
- * @return {!goog.math.Coordinate} Object with values 'x' and 'y'.
- * @deprecated Use {@link goog.dom.getDocumentScroll} instead.
- */
-goog.dom.getPageScroll = function(opt_window) {
- var win = opt_window || goog.global || window;
- return goog.dom.getDomHelper(win.document).getDocumentScroll();
-};
-
-
-/**
- * Gets the document scroll distance as a coordinate object.
- *
- * @return {!goog.math.Coordinate} Object with values 'x' and 'y'.
- */
-goog.dom.getDocumentScroll = function() {
- return goog.dom.getDocumentScroll_(document);
-};
-
-
-/**
- * Helper for {@code getDocumentScroll}.
- *
- * @param {!Document} doc The document to get the scroll for.
- * @return {!goog.math.Coordinate} Object with values 'x' and 'y'.
- * @private
- */
-goog.dom.getDocumentScroll_ = function(doc) {
- var el = goog.dom.getDocumentScrollElement_(doc);
- var win = goog.dom.getWindow_(doc);
- if (goog.userAgent.IE && goog.userAgent.isVersionOrHigher('10') &&
- win.pageYOffset != el.scrollTop) {
- // The keyboard on IE10 touch devices shifts the page using the pageYOffset
- // without modifying scrollTop. For this case, we want the body scroll
- // offsets.
- return new goog.math.Coordinate(el.scrollLeft, el.scrollTop);
- }
- return new goog.math.Coordinate(
- win.pageXOffset || el.scrollLeft, win.pageYOffset || el.scrollTop);
-};
-
-
-/**
- * Gets the document scroll element.
- * @return {!Element} Scrolling element.
- */
-goog.dom.getDocumentScrollElement = function() {
- return goog.dom.getDocumentScrollElement_(document);
-};
-
-
-/**
- * Helper for {@code getDocumentScrollElement}.
- * @param {!Document} doc The document to get the scroll element for.
- * @return {!Element} Scrolling element.
- * @private
- */
-goog.dom.getDocumentScrollElement_ = function(doc) {
- // Old WebKit needs body.scrollLeft in both quirks mode and strict mode. We
- // also default to the documentElement if the document does not have a body
- // (e.g. a SVG document).
- // Uses http://dev.w3.org/csswg/cssom-view/#dom-document-scrollingelement to
- // avoid trying to guess about browser behavior from the UA string.
- if (doc.scrollingElement) {
- return doc.scrollingElement;
- }
- if (!goog.userAgent.WEBKIT && goog.dom.isCss1CompatMode_(doc)) {
- return doc.documentElement;
- }
- return doc.body || doc.documentElement;
-};
-
-
-/**
- * Gets the window object associated with the given document.
- *
- * @param {Document=} opt_doc Document object to get window for.
- * @return {!Window} The window associated with the given document.
- */
-goog.dom.getWindow = function(opt_doc) {
- // TODO(arv): This should not take an argument.
- return opt_doc ? goog.dom.getWindow_(opt_doc) : window;
-};
-
-
-/**
- * Helper for {@code getWindow}.
- *
- * @param {!Document} doc Document object to get window for.
- * @return {!Window} The window associated with the given document.
- * @private
- */
-goog.dom.getWindow_ = function(doc) {
- return /** @type {!Window} */ (doc.parentWindow || doc.defaultView);
-};
-
-
-/**
- * Returns a dom node with a set of attributes. This function accepts varargs
- * for subsequent nodes to be added. Subsequent nodes will be added to the
- * first node as childNodes.
- *
- * So:
- * <code>createDom(goog.dom.TagName.DIV, null, createDom(goog.dom.TagName.P),
- * createDom(goog.dom.TagName.P));</code> would return a div with two child
- * paragraphs
- *
- * For passing properties, please see {@link goog.dom.setProperties} for more
- * information.
- *
- * @param {string|!goog.dom.TagName<T>} tagName Tag to create.
- * @param {?Object|?Array<string>|string=} opt_attributes If object, then a map
- * of name-value pairs for attributes. If a string, then this is the
- * className of the new element. If an array, the elements will be joined
- * together as the className of the new element.
- * @param {...(Object|string|Array|NodeList)} var_args Further DOM nodes or
- * strings for text nodes. If one of the var_args is an array or NodeList,
- * its elements will be added as childNodes instead.
- * @return {R} Reference to a DOM node. The return type is {!Element} if tagName
- * is a string or a more specific type if it is a member of
- * goog.dom.TagName (e.g. {!HTMLAnchorElement} for goog.dom.TagName.A).
- * @template T
- * @template R := cond(isUnknown(T), 'Element', T) =:
- */
-goog.dom.createDom = function(tagName, opt_attributes, var_args) {
- return goog.dom.createDom_(document, arguments);
-};
-
-
-/**
- * Helper for {@code createDom}.
- * @param {!Document} doc The document to create the DOM in.
- * @param {!Arguments} args Argument object passed from the callers. See
- * {@code goog.dom.createDom} for details.
- * @return {!Element} Reference to a DOM node.
- * @private
- */
-goog.dom.createDom_ = function(doc, args) {
- var tagName = String(args[0]);
- var attributes = args[1];
-
- // Internet Explorer is dumb:
- // name: https://msdn.microsoft.com/en-us/library/ms534184(v=vs.85).aspx
- // type: https://msdn.microsoft.com/en-us/library/ms534700(v=vs.85).aspx
- // Also does not allow setting of 'type' attribute on 'input' or 'button'.
- if (!goog.dom.BrowserFeature.CAN_ADD_NAME_OR_TYPE_ATTRIBUTES && attributes &&
- (attributes.name || attributes.type)) {
- var tagNameArr = ['<', tagName];
- if (attributes.name) {
- tagNameArr.push(' name="', goog.string.htmlEscape(attributes.name), '"');
- }
- if (attributes.type) {
- tagNameArr.push(' type="', goog.string.htmlEscape(attributes.type), '"');
-
- // Clone attributes map to remove 'type' without mutating the input.
- var clone = {};
- goog.object.extend(clone, attributes);
-
- // JSCompiler can't see how goog.object.extend added this property,
- // because it was essentially added by reflection.
- // So it needs to be quoted.
- delete clone['type'];
-
- attributes = clone;
- }
- tagNameArr.push('>');
- tagName = tagNameArr.join('');
- }
-
- var element = doc.createElement(tagName);
-
- if (attributes) {
- if (goog.isString(attributes)) {
- element.className = attributes;
- } else if (goog.isArray(attributes)) {
- element.className = attributes.join(' ');
- } else {
- goog.dom.setProperties(element, attributes);
- }
- }
-
- if (args.length > 2) {
- goog.dom.append_(doc, element, args, 2);
- }
-
- return element;
-};
-
-
-/**
- * Appends a node with text or other nodes.
- * @param {!Document} doc The document to create new nodes in.
- * @param {!Node} parent The node to append nodes to.
- * @param {!Arguments} args The values to add. See {@code goog.dom.append}.
- * @param {number} startIndex The index of the array to start from.
- * @private
- */
-goog.dom.append_ = function(doc, parent, args, startIndex) {
- function childHandler(child) {
- // TODO(user): More coercion, ala MochiKit?
- if (child) {
- parent.appendChild(
- goog.isString(child) ? doc.createTextNode(child) : child);
- }
- }
-
- for (var i = startIndex; i < args.length; i++) {
- var arg = args[i];
- // TODO(attila): Fix isArrayLike to return false for a text node.
- if (goog.isArrayLike(arg) && !goog.dom.isNodeLike(arg)) {
- // If the argument is a node list, not a real array, use a clone,
- // because forEach can't be used to mutate a NodeList.
- goog.array.forEach(
- goog.dom.isNodeList(arg) ? goog.array.toArray(arg) : arg,
- childHandler);
- } else {
- childHandler(arg);
- }
- }
-};
-
-
-/**
- * Alias for {@code createDom}.
- * @param {string|!goog.dom.TagName<T>} tagName Tag to create.
- * @param {?Object|?Array<string>|string=} opt_attributes If object, then a map
- * of name-value pairs for attributes. If a string, then this is the
- * className of the new element. If an array, the elements will be joined
- * together as the className of the new element.
- * @param {...(Object|string|Array|NodeList)} var_args Further DOM nodes or
- * strings for text nodes. If one of the var_args is an array, its
- * children will be added as childNodes instead.
- * @return {R} Reference to a DOM node. The return type is {!Element} if tagName
- * is a string or a more specific type if it is a member of
- * goog.dom.TagName (e.g. {!HTMLAnchorElement} for goog.dom.TagName.A).
- * @template T
- * @template R := cond(isUnknown(T), 'Element', T) =:
- * @deprecated Use {@link goog.dom.createDom} instead.
- */
-goog.dom.$dom = goog.dom.createDom;
-
-
-/**
- * Creates a new element.
- * @param {string|!goog.dom.TagName<T>} name Tag to create.
- * @return {R} The new element. The return type is {!Element} if name is
- * a string or a more specific type if it is a member of goog.dom.TagName
- * (e.g. {!HTMLAnchorElement} for goog.dom.TagName.A).
- * @template T
- * @template R := cond(isUnknown(T), 'Element', T) =:
- */
-goog.dom.createElement = function(name) {
- return goog.dom.createElement_(document, name);
-};
-
-
-/**
- * Creates a new element.
- * @param {!Document} doc The document to create the element in.
- * @param {string|!goog.dom.TagName<T>} name Tag to create.
- * @return {R} The new element. The return type is {!Element} if name is
- * a string or a more specific type if it is a member of goog.dom.TagName
- * (e.g. {!HTMLAnchorElement} for goog.dom.TagName.A).
- * @template T
- * @template R := cond(isUnknown(T), 'Element', T) =:
- * @private
- */
-goog.dom.createElement_ = function(doc, name) {
- return doc.createElement(String(name));
-};
-
-
-/**
- * Creates a new text node.
- * @param {number|string} content Content.
- * @return {!Text} The new text node.
- */
-goog.dom.createTextNode = function(content) {
- return document.createTextNode(String(content));
-};
-
-
-/**
- * Create a table.
- * @param {number} rows The number of rows in the table. Must be >= 1.
- * @param {number} columns The number of columns in the table. Must be >= 1.
- * @param {boolean=} opt_fillWithNbsp If true, fills table entries with
- * {@code goog.string.Unicode.NBSP} characters.
- * @return {!Element} The created table.
- */
-goog.dom.createTable = function(rows, columns, opt_fillWithNbsp) {
- // TODO(mlourenco): Return HTMLTableElement, also in prototype function.
- // Callers need to be updated to e.g. not assign numbers to table.cellSpacing.
- return goog.dom.createTable_(document, rows, columns, !!opt_fillWithNbsp);
-};
-
-
-/**
- * Create a table.
- * @param {!Document} doc Document object to use to create the table.
- * @param {number} rows The number of rows in the table. Must be >= 1.
- * @param {number} columns The number of columns in the table. Must be >= 1.
- * @param {boolean} fillWithNbsp If true, fills table entries with
- * {@code goog.string.Unicode.NBSP} characters.
- * @return {!HTMLTableElement} The created table.
- * @private
- */
-goog.dom.createTable_ = function(doc, rows, columns, fillWithNbsp) {
- var table = goog.dom.createElement_(doc, goog.dom.TagName.TABLE);
- var tbody =
- table.appendChild(goog.dom.createElement_(doc, goog.dom.TagName.TBODY));
- for (var i = 0; i < rows; i++) {
- var tr = goog.dom.createElement_(doc, goog.dom.TagName.TR);
- for (var j = 0; j < columns; j++) {
- var td = goog.dom.createElement_(doc, goog.dom.TagName.TD);
- // IE <= 9 will create a text node if we set text content to the empty
- // string, so we avoid doing it unless necessary. This ensures that the
- // same DOM tree is returned on all browsers.
- if (fillWithNbsp) {
- goog.dom.setTextContent(td, goog.string.Unicode.NBSP);
- }
- tr.appendChild(td);
- }
- tbody.appendChild(tr);
- }
- return table;
-};
-
-
-
-/**
- * Creates a new Node from constant strings of HTML markup.
- * @param {...!goog.string.Const} var_args The HTML strings to concatenate then
- * convert into a node.
- * @return {!Node}
- */
-goog.dom.constHtmlToNode = function(var_args) {
- var stringArray = goog.array.map(arguments, goog.string.Const.unwrap);
- var safeHtml =
- goog.html.uncheckedconversions
- .safeHtmlFromStringKnownToSatisfyTypeContract(
- goog.string.Const.from(
- 'Constant HTML string, that gets turned into a ' +
- 'Node later, so it will be automatically balanced.'),
- stringArray.join(''));
- return goog.dom.safeHtmlToNode(safeHtml);
-};
-
-
-/**
- * Converts HTML markup into a node. This is a safe version of
- * {@code goog.dom.htmlToDocumentFragment} which is now deleted.
- * @param {!goog.html.SafeHtml} html The HTML markup to convert.
- * @return {!Node} The resulting node.
- */
-goog.dom.safeHtmlToNode = function(html) {
- return goog.dom.safeHtmlToNode_(document, html);
-};
-
-
-/**
- * Helper for {@code safeHtmlToNode}.
- * @param {!Document} doc The document.
- * @param {!goog.html.SafeHtml} html The HTML markup to convert.
- * @return {!Node} The resulting node.
- * @private
- */
-goog.dom.safeHtmlToNode_ = function(doc, html) {
- var tempDiv = goog.dom.createElement_(doc, goog.dom.TagName.DIV);
- if (goog.dom.BrowserFeature.INNER_HTML_NEEDS_SCOPED_ELEMENT) {
- goog.dom.safe.setInnerHtml(
- tempDiv, goog.html.SafeHtml.concat(goog.html.SafeHtml.BR, html));
- tempDiv.removeChild(tempDiv.firstChild);
- } else {
- goog.dom.safe.setInnerHtml(tempDiv, html);
- }
- return goog.dom.childrenToNode_(doc, tempDiv);
-};
-
-
-/**
- * Helper for {@code safeHtmlToNode_}.
- * @param {!Document} doc The document.
- * @param {!Node} tempDiv The input node.
- * @return {!Node} The resulting node.
- * @private
- */
-goog.dom.childrenToNode_ = function(doc, tempDiv) {
- if (tempDiv.childNodes.length == 1) {
- return tempDiv.removeChild(tempDiv.firstChild);
- } else {
- var fragment = doc.createDocumentFragment();
- while (tempDiv.firstChild) {
- fragment.appendChild(tempDiv.firstChild);
- }
- return fragment;
- }
-};
-
-
-/**
- * Returns true if the browser is in "CSS1-compatible" (standards-compliant)
- * mode, false otherwise.
- * @return {boolean} True if in CSS1-compatible mode.
- */
-goog.dom.isCss1CompatMode = function() {
- return goog.dom.isCss1CompatMode_(document);
-};
-
-
-/**
- * Returns true if the browser is in "CSS1-compatible" (standards-compliant)
- * mode, false otherwise.
- * @param {!Document} doc The document to check.
- * @return {boolean} True if in CSS1-compatible mode.
- * @private
- */
-goog.dom.isCss1CompatMode_ = function(doc) {
- if (goog.dom.COMPAT_MODE_KNOWN_) {
- return goog.dom.ASSUME_STANDARDS_MODE;
- }
-
- return doc.compatMode == 'CSS1Compat';
-};
-
-
-/**
- * Determines if the given node can contain children, intended to be used for
- * HTML generation.
- *
- * IE natively supports node.canHaveChildren but has inconsistent behavior.
- * Prior to IE8 the base tag allows children and in IE9 all nodes return true
- * for canHaveChildren.
- *
- * In practice all non-IE browsers allow you to add children to any node, but
- * the behavior is inconsistent:
- *
- * <pre>
- * var a = goog.dom.createElement(goog.dom.TagName.BR);
- * a.appendChild(document.createTextNode('foo'));
- * a.appendChild(document.createTextNode('bar'));
- * console.log(a.childNodes.length); // 2
- * console.log(a.innerHTML); // Chrome: "", IE9: "foobar", FF3.5: "foobar"
- * </pre>
- *
- * For more information, see:
- * http://dev.w3.org/html5/markup/syntax.html#syntax-elements
- *
- * TODO(user): Rename shouldAllowChildren() ?
- *
- * @param {Node} node The node to check.
- * @return {boolean} Whether the node can contain children.
- */
-goog.dom.canHaveChildren = function(node) {
- if (node.nodeType != goog.dom.NodeType.ELEMENT) {
- return false;
- }
- switch (/** @type {!Element} */ (node).tagName) {
- case String(goog.dom.TagName.APPLET):
- case String(goog.dom.TagName.AREA):
- case String(goog.dom.TagName.BASE):
- case String(goog.dom.TagName.BR):
- case String(goog.dom.TagName.COL):
- case String(goog.dom.TagName.COMMAND):
- case String(goog.dom.TagName.EMBED):
- case String(goog.dom.TagName.FRAME):
- case String(goog.dom.TagName.HR):
- case String(goog.dom.TagName.IMG):
- case String(goog.dom.TagName.INPUT):
- case String(goog.dom.TagName.IFRAME):
- case String(goog.dom.TagName.ISINDEX):
- case String(goog.dom.TagName.KEYGEN):
- case String(goog.dom.TagName.LINK):
- case String(goog.dom.TagName.NOFRAMES):
- case String(goog.dom.TagName.NOSCRIPT):
- case String(goog.dom.TagName.META):
- case String(goog.dom.TagName.OBJECT):
- case String(goog.dom.TagName.PARAM):
- case String(goog.dom.TagName.SCRIPT):
- case String(goog.dom.TagName.SOURCE):
- case String(goog.dom.TagName.STYLE):
- case String(goog.dom.TagName.TRACK):
- case String(goog.dom.TagName.WBR):
- return false;
- }
- return true;
-};
-
-
-/**
- * Appends a child to a node.
- * @param {Node} parent Parent.
- * @param {Node} child Child.
- */
-goog.dom.appendChild = function(parent, child) {
- parent.appendChild(child);
-};
-
-
-/**
- * Appends a node with text or other nodes.
- * @param {!Node} parent The node to append nodes to.
- * @param {...goog.dom.Appendable} var_args The things to append to the node.
- * If this is a Node it is appended as is.
- * If this is a string then a text node is appended.
- * If this is an array like object then fields 0 to length - 1 are appended.
- */
-goog.dom.append = function(parent, var_args) {
- goog.dom.append_(goog.dom.getOwnerDocument(parent), parent, arguments, 1);
-};
-
-
-/**
- * Removes all the child nodes on a DOM node.
- * @param {Node} node Node to remove children from.
- */
-goog.dom.removeChildren = function(node) {
- // Note: Iterations over live collections can be slow, this is the fastest
- // we could find. The double parenthesis are used to prevent JsCompiler and
- // strict warnings.
- var child;
- while ((child = node.firstChild)) {
- node.removeChild(child);
- }
-};
-
-
-/**
- * Inserts a new node before an existing reference node (i.e. as the previous
- * sibling). If the reference node has no parent, then does nothing.
- * @param {Node} newNode Node to insert.
- * @param {Node} refNode Reference node to insert before.
- */
-goog.dom.insertSiblingBefore = function(newNode, refNode) {
- if (refNode.parentNode) {
- refNode.parentNode.insertBefore(newNode, refNode);
- }
-};
-
-
-/**
- * Inserts a new node after an existing reference node (i.e. as the next
- * sibling). If the reference node has no parent, then does nothing.
- * @param {Node} newNode Node to insert.
- * @param {Node} refNode Reference node to insert after.
- */
-goog.dom.insertSiblingAfter = function(newNode, refNode) {
- if (refNode.parentNode) {
- refNode.parentNode.insertBefore(newNode, refNode.nextSibling);
- }
-};
-
-
-/**
- * Insert a child at a given index. If index is larger than the number of child
- * nodes that the parent currently has, the node is inserted as the last child
- * node.
- * @param {Element} parent The element into which to insert the child.
- * @param {Node} child The element to insert.
- * @param {number} index The index at which to insert the new child node. Must
- * not be negative.
- */
-goog.dom.insertChildAt = function(parent, child, index) {
- // Note that if the second argument is null, insertBefore
- // will append the child at the end of the list of children.
- parent.insertBefore(child, parent.childNodes[index] || null);
-};
-
-
-/**
- * Removes a node from its parent.
- * @param {Node} node The node to remove.
- * @return {Node} The node removed if removed; else, null.
- */
-goog.dom.removeNode = function(node) {
- return node && node.parentNode ? node.parentNode.removeChild(node) : null;
-};
-
-
-/**
- * Replaces a node in the DOM tree. Will do nothing if {@code oldNode} has no
- * parent.
- * @param {Node} newNode Node to insert.
- * @param {Node} oldNode Node to replace.
- */
-goog.dom.replaceNode = function(newNode, oldNode) {
- var parent = oldNode.parentNode;
- if (parent) {
- parent.replaceChild(newNode, oldNode);
- }
-};
-
-
-/**
- * Flattens an element. That is, removes it and replace it with its children.
- * Does nothing if the element is not in the document.
- * @param {Element} element The element to flatten.
- * @return {Element|undefined} The original element, detached from the document
- * tree, sans children; or undefined, if the element was not in the document
- * to begin with.
- */
-goog.dom.flattenElement = function(element) {
- var child, parent = element.parentNode;
- if (parent && parent.nodeType != goog.dom.NodeType.DOCUMENT_FRAGMENT) {
- // Use IE DOM method (supported by Opera too) if available
- if (element.removeNode) {
- return /** @type {Element} */ (element.removeNode(false));
- } else {
- // Move all children of the original node up one level.
- while ((child = element.firstChild)) {
- parent.insertBefore(child, element);
- }
-
- // Detach the original element.
- return /** @type {Element} */ (goog.dom.removeNode(element));
- }
- }
-};
-
-
-/**
- * Returns an array containing just the element children of the given element.
- * @param {Element} element The element whose element children we want.
- * @return {!(Array<!Element>|NodeList<!Element>)} An array or array-like list
- * of just the element children of the given element.
- */
-goog.dom.getChildren = function(element) {
- // We check if the children attribute is supported for child elements
- // since IE8 misuses the attribute by also including comments.
- if (goog.dom.BrowserFeature.CAN_USE_CHILDREN_ATTRIBUTE &&
- element.children != undefined) {
- return element.children;
- }
- // Fall back to manually filtering the element's child nodes.
- return goog.array.filter(element.childNodes, function(node) {
- return node.nodeType == goog.dom.NodeType.ELEMENT;
- });
-};
-
-
-/**
- * Returns the first child node that is an element.
- * @param {Node} node The node to get the first child element of.
- * @return {Element} The first child node of {@code node} that is an element.
- */
-goog.dom.getFirstElementChild = function(node) {
- if (goog.isDef(node.firstElementChild)) {
- return /** @type {!Element} */ (node).firstElementChild;
- }
- return goog.dom.getNextElementNode_(node.firstChild, true);
-};
-
-
-/**
- * Returns the last child node that is an element.
- * @param {Node} node The node to get the last child element of.
- * @return {Element} The last child node of {@code node} that is an element.
- */
-goog.dom.getLastElementChild = function(node) {
- if (goog.isDef(node.lastElementChild)) {
- return /** @type {!Element} */ (node).lastElementChild;
- }
- return goog.dom.getNextElementNode_(node.lastChild, false);
-};
-
-
-/**
- * Returns the first next sibling that is an element.
- * @param {Node} node The node to get the next sibling element of.
- * @return {Element} The next sibling of {@code node} that is an element.
- */
-goog.dom.getNextElementSibling = function(node) {
- if (goog.isDef(node.nextElementSibling)) {
- return /** @type {!Element} */ (node).nextElementSibling;
- }
- return goog.dom.getNextElementNode_(node.nextSibling, true);
-};
-
-
-/**
- * Returns the first previous sibling that is an element.
- * @param {Node} node The node to get the previous sibling element of.
- * @return {Element} The first previous sibling of {@code node} that is
- * an element.
- */
-goog.dom.getPreviousElementSibling = function(node) {
- if (goog.isDef(node.previousElementSibling)) {
- return /** @type {!Element} */ (node).previousElementSibling;
- }
- return goog.dom.getNextElementNode_(node.previousSibling, false);
-};
-
-
-/**
- * Returns the first node that is an element in the specified direction,
- * starting with {@code node}.
- * @param {Node} node The node to get the next element from.
- * @param {boolean} forward Whether to look forwards or backwards.
- * @return {Element} The first element.
- * @private
- */
-goog.dom.getNextElementNode_ = function(node, forward) {
- while (node && node.nodeType != goog.dom.NodeType.ELEMENT) {
- node = forward ? node.nextSibling : node.previousSibling;
- }
-
- return /** @type {Element} */ (node);
-};
-
-
-/**
- * Returns the next node in source order from the given node.
- * @param {Node} node The node.
- * @return {Node} The next node in the DOM tree, or null if this was the last
- * node.
- */
-goog.dom.getNextNode = function(node) {
- if (!node) {
- return null;
- }
-
- if (node.firstChild) {
- return node.firstChild;
- }
-
- while (node && !node.nextSibling) {
- node = node.parentNode;
- }
-
- return node ? node.nextSibling : null;
-};
-
-
-/**
- * Returns the previous node in source order from the given node.
- * @param {Node} node The node.
- * @return {Node} The previous node in the DOM tree, or null if this was the
- * first node.
- */
-goog.dom.getPreviousNode = function(node) {
- if (!node) {
- return null;
- }
-
- if (!node.previousSibling) {
- return node.parentNode;
- }
-
- node = node.previousSibling;
- while (node && node.lastChild) {
- node = node.lastChild;
- }
-
- return node;
-};
-
-
-/**
- * Whether the object looks like a DOM node.
- * @param {?} obj The object being tested for node likeness.
- * @return {boolean} Whether the object looks like a DOM node.
- */
-goog.dom.isNodeLike = function(obj) {
- return goog.isObject(obj) && obj.nodeType > 0;
-};
-
-
-/**
- * Whether the object looks like an Element.
- * @param {?} obj The object being tested for Element likeness.
- * @return {boolean} Whether the object looks like an Element.
- */
-goog.dom.isElement = function(obj) {
- return goog.isObject(obj) && obj.nodeType == goog.dom.NodeType.ELEMENT;
-};
-
-
-/**
- * Returns true if the specified value is a Window object. This includes the
- * global window for HTML pages, and iframe windows.
- * @param {?} obj Variable to test.
- * @return {boolean} Whether the variable is a window.
- */
-goog.dom.isWindow = function(obj) {
- return goog.isObject(obj) && obj['window'] == obj;
-};
-
-
-/**
- * Returns an element's parent, if it's an Element.
- * @param {Element} element The DOM element.
- * @return {Element} The parent, or null if not an Element.
- */
-goog.dom.getParentElement = function(element) {
- var parent;
- if (goog.dom.BrowserFeature.CAN_USE_PARENT_ELEMENT_PROPERTY) {
- var isIe9 = goog.userAgent.IE && goog.userAgent.isVersionOrHigher('9') &&
- !goog.userAgent.isVersionOrHigher('10');
- // SVG elements in IE9 can't use the parentElement property.
- // goog.global['SVGElement'] is not defined in IE9 quirks mode.
- if (!(isIe9 && goog.global['SVGElement'] &&
- element instanceof goog.global['SVGElement'])) {
- parent = element.parentElement;
- if (parent) {
- return parent;
- }
- }
- }
- parent = element.parentNode;
- return goog.dom.isElement(parent) ? /** @type {!Element} */ (parent) : null;
-};
-
-
-/**
- * Whether a node contains another node.
- * @param {?Node|undefined} parent The node that should contain the other node.
- * @param {?Node|undefined} descendant The node to test presence of.
- * @return {boolean} Whether the parent node contains the descendent node.
- */
-goog.dom.contains = function(parent, descendant) {
- if (!parent || !descendant) {
- return false;
- }
- // We use browser specific methods for this if available since it is faster
- // that way.
-
- // IE DOM
- if (parent.contains && descendant.nodeType == goog.dom.NodeType.ELEMENT) {
- return parent == descendant || parent.contains(descendant);
- }
-
- // W3C DOM Level 3
- if (typeof parent.compareDocumentPosition != 'undefined') {
- return parent == descendant ||
- Boolean(parent.compareDocumentPosition(descendant) & 16);
- }
-
- // W3C DOM Level 1
- while (descendant && parent != descendant) {
- descendant = descendant.parentNode;
- }
- return descendant == parent;
-};
-
-
-/**
- * Compares the document order of two nodes, returning 0 if they are the same
- * node, a negative number if node1 is before node2, and a positive number if
- * node2 is before node1. Note that we compare the order the tags appear in the
- * document so in the tree <b><i>text</i></b> the B node is considered to be
- * before the I node.
- *
- * @param {Node} node1 The first node to compare.
- * @param {Node} node2 The second node to compare.
- * @return {number} 0 if the nodes are the same node, a negative number if node1
- * is before node2, and a positive number if node2 is before node1.
- */
-goog.dom.compareNodeOrder = function(node1, node2) {
- // Fall out quickly for equality.
- if (node1 == node2) {
- return 0;
- }
-
- // Use compareDocumentPosition where available
- if (node1.compareDocumentPosition) {
- // 4 is the bitmask for FOLLOWS.
- return node1.compareDocumentPosition(node2) & 2 ? 1 : -1;
- }
-
- // Special case for document nodes on IE 7 and 8.
- if (goog.userAgent.IE && !goog.userAgent.isDocumentModeOrHigher(9)) {
- if (node1.nodeType == goog.dom.NodeType.DOCUMENT) {
- return -1;
- }
- if (node2.nodeType == goog.dom.NodeType.DOCUMENT) {
- return 1;
- }
- }
-
- // Process in IE using sourceIndex - we check to see if the first node has
- // a source index or if its parent has one.
- if ('sourceIndex' in node1 ||
- (node1.parentNode && 'sourceIndex' in node1.parentNode)) {
- var isElement1 = node1.nodeType == goog.dom.NodeType.ELEMENT;
- var isElement2 = node2.nodeType == goog.dom.NodeType.ELEMENT;
-
- if (isElement1 && isElement2) {
- return node1.sourceIndex - node2.sourceIndex;
- } else {
- var parent1 = node1.parentNode;
- var parent2 = node2.parentNode;
-
- if (parent1 == parent2) {
- return goog.dom.compareSiblingOrder_(node1, node2);
- }
-
- if (!isElement1 && goog.dom.contains(parent1, node2)) {
- return -1 * goog.dom.compareParentsDescendantNodeIe_(node1, node2);
- }
-
-
- if (!isElement2 && goog.dom.contains(parent2, node1)) {
- return goog.dom.compareParentsDescendantNodeIe_(node2, node1);
- }
-
- return (isElement1 ? node1.sourceIndex : parent1.sourceIndex) -
- (isElement2 ? node2.sourceIndex : parent2.sourceIndex);
- }
- }
-
- // For Safari, we compare ranges.
- var doc = goog.dom.getOwnerDocument(node1);
-
- var range1, range2;
- range1 = doc.createRange();
- range1.selectNode(node1);
- range1.collapse(true);
-
- range2 = doc.createRange();
- range2.selectNode(node2);
- range2.collapse(true);
-
- return range1.compareBoundaryPoints(
- goog.global['Range'].START_TO_END, range2);
-};
-
-
-/**
- * Utility function to compare the position of two nodes, when
- * {@code textNode}'s parent is an ancestor of {@code node}. If this entry
- * condition is not met, this function will attempt to reference a null object.
- * @param {!Node} textNode The textNode to compare.
- * @param {Node} node The node to compare.
- * @return {number} -1 if node is before textNode, +1 otherwise.
- * @private
- */
-goog.dom.compareParentsDescendantNodeIe_ = function(textNode, node) {
- var parent = textNode.parentNode;
- if (parent == node) {
- // If textNode is a child of node, then node comes first.
- return -1;
- }
- var sibling = node;
- while (sibling.parentNode != parent) {
- sibling = sibling.parentNode;
- }
- return goog.dom.compareSiblingOrder_(sibling, textNode);
-};
-
-
-/**
- * Utility function to compare the position of two nodes known to be non-equal
- * siblings.
- * @param {Node} node1 The first node to compare.
- * @param {!Node} node2 The second node to compare.
- * @return {number} -1 if node1 is before node2, +1 otherwise.
- * @private
- */
-goog.dom.compareSiblingOrder_ = function(node1, node2) {
- var s = node2;
- while ((s = s.previousSibling)) {
- if (s == node1) {
- // We just found node1 before node2.
- return -1;
- }
- }
-
- // Since we didn't find it, node1 must be after node2.
- return 1;
-};
-
-
-/**
- * Find the deepest common ancestor of the given nodes.
- * @param {...Node} var_args The nodes to find a common ancestor of.
- * @return {Node} The common ancestor of the nodes, or null if there is none.
- * null will only be returned if two or more of the nodes are from different
- * documents.
- */
-goog.dom.findCommonAncestor = function(var_args) {
- var i, count = arguments.length;
- if (!count) {
- return null;
- } else if (count == 1) {
- return arguments[0];
- }
-
- var paths = [];
- var minLength = Infinity;
- for (i = 0; i < count; i++) {
- // Compute the list of ancestors.
- var ancestors = [];
- var node = arguments[i];
- while (node) {
- ancestors.unshift(node);
- node = node.parentNode;
- }
-
- // Save the list for comparison.
- paths.push(ancestors);
- minLength = Math.min(minLength, ancestors.length);
- }
- var output = null;
- for (i = 0; i < minLength; i++) {
- var first = paths[0][i];
- for (var j = 1; j < count; j++) {
- if (first != paths[j][i]) {
- return output;
- }
- }
- output = first;
- }
- return output;
-};
-
-
-/**
- * Returns the owner document for a node.
- * @param {Node|Window} node The node to get the document for.
- * @return {!Document} The document owning the node.
- */
-goog.dom.getOwnerDocument = function(node) {
- // TODO(nnaze): Update param signature to be non-nullable.
- goog.asserts.assert(node, 'Node cannot be null or undefined.');
- return /** @type {!Document} */ (
- node.nodeType == goog.dom.NodeType.DOCUMENT ? node : node.ownerDocument ||
- node.document);
-};
-
-
-/**
- * Cross-browser function for getting the document element of a frame or iframe.
- * @param {Element} frame Frame element.
- * @return {!Document} The frame content document.
- */
-goog.dom.getFrameContentDocument = function(frame) {
- return frame.contentDocument ||
- /** @type {!HTMLFrameElement} */ (frame).contentWindow.document;
-};
-
-
-/**
- * Cross-browser function for getting the window of a frame or iframe.
- * @param {Element} frame Frame element.
- * @return {Window} The window associated with the given frame, or null if none
- * exists.
- */
-goog.dom.getFrameContentWindow = function(frame) {
- try {
- return frame.contentWindow ||
- (frame.contentDocument ? goog.dom.getWindow(frame.contentDocument) :
- null);
- } catch (e) {
- // NOTE(user): In IE8, checking the contentWindow or contentDocument
- // properties will throw a "Unspecified Error" exception if the iframe is
- // not inserted in the DOM. If we get this we can be sure that no window
- // exists, so return null.
- }
- return null;
-};
-
-
-/**
- * Sets the text content of a node, with cross-browser support.
- * @param {Node} node The node to change the text content of.
- * @param {string|number} text The value that should replace the node's content.
- */
-goog.dom.setTextContent = function(node, text) {
- goog.asserts.assert(
- node != null,
- 'goog.dom.setTextContent expects a non-null value for node');
-
- if ('textContent' in node) {
- node.textContent = text;
- } else if (node.nodeType == goog.dom.NodeType.TEXT) {
- /** @type {!Text} */ (node).data = String(text);
- } else if (
- node.firstChild && node.firstChild.nodeType == goog.dom.NodeType.TEXT) {
- // If the first child is a text node we just change its data and remove the
- // rest of the children.
- while (node.lastChild != node.firstChild) {
- node.removeChild(node.lastChild);
- }
- /** @type {!Text} */ (node.firstChild).data = String(text);
- } else {
- goog.dom.removeChildren(node);
- var doc = goog.dom.getOwnerDocument(node);
- node.appendChild(doc.createTextNode(String(text)));
- }
-};
-
-
-/**
- * Gets the outerHTML of a node, which islike innerHTML, except that it
- * actually contains the HTML of the node itself.
- * @param {Element} element The element to get the HTML of.
- * @return {string} The outerHTML of the given element.
- */
-goog.dom.getOuterHtml = function(element) {
- goog.asserts.assert(
- element !== null,
- 'goog.dom.getOuterHtml expects a non-null value for element');
- // IE, Opera and WebKit all have outerHTML.
- if ('outerHTML' in element) {
- return element.outerHTML;
- } else {
- var doc = goog.dom.getOwnerDocument(element);
- var div = goog.dom.createElement_(doc, goog.dom.TagName.DIV);
- div.appendChild(element.cloneNode(true));
- return div.innerHTML;
- }
-};
-
-
-/**
- * Finds the first descendant node that matches the filter function, using
- * a depth first search. This function offers the most general purpose way
- * of finding a matching element. You may also wish to consider
- * {@code goog.dom.query} which can express many matching criteria using
- * CSS selector expressions. These expressions often result in a more
- * compact representation of the desired result.
- * @see goog.dom.query
- *
- * @param {Node} root The root of the tree to search.
- * @param {function(Node) : boolean} p The filter function.
- * @return {Node|undefined} The found node or undefined if none is found.
- */
-goog.dom.findNode = function(root, p) {
- var rv = [];
- var found = goog.dom.findNodes_(root, p, rv, true);
- return found ? rv[0] : undefined;
-};
-
-
-/**
- * Finds all the descendant nodes that match the filter function, using a
- * a depth first search. This function offers the most general-purpose way
- * of finding a set of matching elements. You may also wish to consider
- * {@code goog.dom.query} which can express many matching criteria using
- * CSS selector expressions. These expressions often result in a more
- * compact representation of the desired result.
-
- * @param {Node} root The root of the tree to search.
- * @param {function(Node) : boolean} p The filter function.
- * @return {!Array<!Node>} The found nodes or an empty array if none are found.
- */
-goog.dom.findNodes = function(root, p) {
- var rv = [];
- goog.dom.findNodes_(root, p, rv, false);
- return rv;
-};
-
-
-/**
- * Finds the first or all the descendant nodes that match the filter function,
- * using a depth first search.
- * @param {Node} root The root of the tree to search.
- * @param {function(Node) : boolean} p The filter function.
- * @param {!Array<!Node>} rv The found nodes are added to this array.
- * @param {boolean} findOne If true we exit after the first found node.
- * @return {boolean} Whether the search is complete or not. True in case findOne
- * is true and the node is found. False otherwise.
- * @private
- */
-goog.dom.findNodes_ = function(root, p, rv, findOne) {
- if (root != null) {
- var child = root.firstChild;
- while (child) {
- if (p(child)) {
- rv.push(child);
- if (findOne) {
- return true;
- }
- }
- if (goog.dom.findNodes_(child, p, rv, findOne)) {
- return true;
- }
- child = child.nextSibling;
- }
- }
- return false;
-};
-
-
-/**
- * Map of tags whose content to ignore when calculating text length.
- * @private {!Object<string, number>}
- * @const
- */
-goog.dom.TAGS_TO_IGNORE_ = {
- 'SCRIPT': 1,
- 'STYLE': 1,
- 'HEAD': 1,
- 'IFRAME': 1,
- 'OBJECT': 1
-};
-
-
-/**
- * Map of tags which have predefined values with regard to whitespace.
- * @private {!Object<string, string>}
- * @const
- */
-goog.dom.PREDEFINED_TAG_VALUES_ = {
- 'IMG': ' ',
- 'BR': '\n'
-};
-
-
-/**
- * Returns true if the element has a tab index that allows it to receive
- * keyboard focus (tabIndex >= 0), false otherwise. Note that some elements
- * natively support keyboard focus, even if they have no tab index.
- * @param {!Element} element Element to check.
- * @return {boolean} Whether the element has a tab index that allows keyboard
- * focus.
- */
-goog.dom.isFocusableTabIndex = function(element) {
- return goog.dom.hasSpecifiedTabIndex_(element) &&
- goog.dom.isTabIndexFocusable_(element);
-};
-
-
-/**
- * Enables or disables keyboard focus support on the element via its tab index.
- * Only elements for which {@link goog.dom.isFocusableTabIndex} returns true
- * (or elements that natively support keyboard focus, like form elements) can
- * receive keyboard focus. See http://go/tabindex for more info.
- * @param {Element} element Element whose tab index is to be changed.
- * @param {boolean} enable Whether to set or remove a tab index on the element
- * that supports keyboard focus.
- */
-goog.dom.setFocusableTabIndex = function(element, enable) {
- if (enable) {
- element.tabIndex = 0;
- } else {
- // Set tabIndex to -1 first, then remove it. This is a workaround for
- // Safari (confirmed in version 4 on Windows). When removing the attribute
- // without setting it to -1 first, the element remains keyboard focusable
- // despite not having a tabIndex attribute anymore.
- element.tabIndex = -1;
- element.removeAttribute('tabIndex'); // Must be camelCase!
- }
-};
-
-
-/**
- * Returns true if the element can be focused, i.e. it has a tab index that
- * allows it to receive keyboard focus (tabIndex >= 0), or it is an element
- * that natively supports keyboard focus.
- * @param {!Element} element Element to check.
- * @return {boolean} Whether the element allows keyboard focus.
- */
-goog.dom.isFocusable = function(element) {
- var focusable;
- // Some elements can have unspecified tab index and still receive focus.
- if (goog.dom.nativelySupportsFocus_(element)) {
- // Make sure the element is not disabled ...
- focusable = !element.disabled &&
- // ... and if a tab index is specified, it allows focus.
- (!goog.dom.hasSpecifiedTabIndex_(element) ||
- goog.dom.isTabIndexFocusable_(element));
- } else {
- focusable = goog.dom.isFocusableTabIndex(element);
- }
-
- // IE requires elements to be visible in order to focus them.
- return focusable && goog.userAgent.IE ?
- goog.dom.hasNonZeroBoundingRect_(/** @type {!HTMLElement} */ (element)) :
- focusable;
-};
-
-
-/**
- * Returns true if the element has a specified tab index.
- * @param {!Element} element Element to check.
- * @return {boolean} Whether the element has a specified tab index.
- * @private
- */
-goog.dom.hasSpecifiedTabIndex_ = function(element) {
- // IE8 and below don't support hasAttribute(), instead check whether the
- // 'tabindex' attributeNode is specified. Otherwise check hasAttribute().
- if (goog.userAgent.IE && !goog.userAgent.isVersionOrHigher('9')) {
- var attrNode = element.getAttributeNode('tabindex'); // Must be lowercase!
- return goog.isDefAndNotNull(attrNode) && attrNode.specified;
- } else {
- return element.hasAttribute('tabindex');
- }
-};
-
-
-/**
- * Returns true if the element's tab index allows the element to be focused.
- * @param {!Element} element Element to check.
- * @return {boolean} Whether the element's tab index allows focus.
- * @private
- */
-goog.dom.isTabIndexFocusable_ = function(element) {
- var index = /** @type {!HTMLElement} */ (element).tabIndex;
- // NOTE: IE9 puts tabIndex in 16-bit int, e.g. -2 is 65534.
- return goog.isNumber(index) && index >= 0 && index < 32768;
-};
-
-
-/**
- * Returns true if the element is focusable even when tabIndex is not set.
- * @param {!Element} element Element to check.
- * @return {boolean} Whether the element natively supports focus.
- * @private
- */
-goog.dom.nativelySupportsFocus_ = function(element) {
- return element.tagName == goog.dom.TagName.A ||
- element.tagName == goog.dom.TagName.INPUT ||
- element.tagName == goog.dom.TagName.TEXTAREA ||
- element.tagName == goog.dom.TagName.SELECT ||
- element.tagName == goog.dom.TagName.BUTTON;
-};
-
-
-/**
- * Returns true if the element has a bounding rectangle that would be visible
- * (i.e. its width and height are greater than zero).
- * @param {!HTMLElement} element Element to check.
- * @return {boolean} Whether the element has a non-zero bounding rectangle.
- * @private
- */
-goog.dom.hasNonZeroBoundingRect_ = function(element) {
- var rect;
- if (!goog.isFunction(element['getBoundingClientRect']) ||
- // In IE, getBoundingClientRect throws on detached nodes.
- (goog.userAgent.IE && element.parentElement == null)) {
- rect = {'height': element.offsetHeight, 'width': element.offsetWidth};
- } else {
- rect = element.getBoundingClientRect();
- }
- return goog.isDefAndNotNull(rect) && rect.height > 0 && rect.width > 0;
-};
-
-
-/**
- * Returns the text content of the current node, without markup and invisible
- * symbols. New lines are stripped and whitespace is collapsed,
- * such that each character would be visible.
- *
- * In browsers that support it, innerText is used. Other browsers attempt to
- * simulate it via node traversal. Line breaks are canonicalized in IE.
- *
- * @param {Node} node The node from which we are getting content.
- * @return {string} The text content.
- */
-goog.dom.getTextContent = function(node) {
- var textContent;
- // Note(arv): IE9, Opera, and Safari 3 support innerText but they include
- // text nodes in script tags. So we revert to use a user agent test here.
- if (goog.dom.BrowserFeature.CAN_USE_INNER_TEXT && node !== null &&
- ('innerText' in node)) {
- textContent = goog.string.canonicalizeNewlines(node.innerText);
- // Unfortunately .innerText() returns text with &shy; symbols
- // We need to filter it out and then remove duplicate whitespaces
- } else {
- var buf = [];
- goog.dom.getTextContent_(node, buf, true);
- textContent = buf.join('');
- }
-
- // Strip &shy; entities. goog.format.insertWordBreaks inserts them in Opera.
- textContent = textContent.replace(/ \xAD /g, ' ').replace(/\xAD/g, '');
- // Strip &#8203; entities. goog.format.insertWordBreaks inserts them in IE8.
- textContent = textContent.replace(/\u200B/g, '');
-
- // Skip this replacement on old browsers with working innerText, which
- // automatically turns &nbsp; into ' ' and / +/ into ' ' when reading
- // innerText.
- if (!goog.dom.BrowserFeature.CAN_USE_INNER_TEXT) {
- textContent = textContent.replace(/ +/g, ' ');
- }
- if (textContent != ' ') {
- textContent = textContent.replace(/^\s*/, '');
- }
-
- return textContent;
-};
-
-
-/**
- * Returns the text content of the current node, without markup.
- *
- * Unlike {@code getTextContent} this method does not collapse whitespaces
- * or normalize lines breaks.
- *
- * @param {Node} node The node from which we are getting content.
- * @return {string} The raw text content.
- */
-goog.dom.getRawTextContent = function(node) {
- var buf = [];
- goog.dom.getTextContent_(node, buf, false);
-
- return buf.join('');
-};
-
-
-/**
- * Recursive support function for text content retrieval.
- *
- * @param {Node} node The node from which we are getting content.
- * @param {Array<string>} buf string buffer.
- * @param {boolean} normalizeWhitespace Whether to normalize whitespace.
- * @private
- */
-goog.dom.getTextContent_ = function(node, buf, normalizeWhitespace) {
- if (node.nodeName in goog.dom.TAGS_TO_IGNORE_) {
- // ignore certain tags
- } else if (node.nodeType == goog.dom.NodeType.TEXT) {
- if (normalizeWhitespace) {
- buf.push(String(node.nodeValue).replace(/(\r\n|\r|\n)/g, ''));
- } else {
- buf.push(node.nodeValue);
- }
- } else if (node.nodeName in goog.dom.PREDEFINED_TAG_VALUES_) {
- buf.push(goog.dom.PREDEFINED_TAG_VALUES_[node.nodeName]);
- } else {
- var child = node.firstChild;
- while (child) {
- goog.dom.getTextContent_(child, buf, normalizeWhitespace);
- child = child.nextSibling;
- }
- }
-};
-
-
-/**
- * Returns the text length of the text contained in a node, without markup. This
- * is equivalent to the selection length if the node was selected, or the number
- * of cursor movements to traverse the node. Images & BRs take one space. New
- * lines are ignored.
- *
- * @param {Node} node The node whose text content length is being calculated.
- * @return {number} The length of {@code node}'s text content.
- */
-goog.dom.getNodeTextLength = function(node) {
- return goog.dom.getTextContent(node).length;
-};
-
-
-/**
- * Returns the text offset of a node relative to one of its ancestors. The text
- * length is the same as the length calculated by goog.dom.getNodeTextLength.
- *
- * @param {Node} node The node whose offset is being calculated.
- * @param {Node=} opt_offsetParent The node relative to which the offset will
- * be calculated. Defaults to the node's owner document's body.
- * @return {number} The text offset.
- */
-goog.dom.getNodeTextOffset = function(node, opt_offsetParent) {
- var root = opt_offsetParent || goog.dom.getOwnerDocument(node).body;
- var buf = [];
- while (node && node != root) {
- var cur = node;
- while ((cur = cur.previousSibling)) {
- buf.unshift(goog.dom.getTextContent(cur));
- }
- node = node.parentNode;
- }
- // Trim left to deal with FF cases when there might be line breaks and empty
- // nodes at the front of the text
- return goog.string.trimLeft(buf.join('')).replace(/ +/g, ' ').length;
-};
-
-
-/**
- * Returns the node at a given offset in a parent node. If an object is
- * provided for the optional third parameter, the node and the remainder of the
- * offset will stored as properties of this object.
- * @param {Node} parent The parent node.
- * @param {number} offset The offset into the parent node.
- * @param {Object=} opt_result Object to be used to store the return value. The
- * return value will be stored in the form {node: Node, remainder: number}
- * if this object is provided.
- * @return {Node} The node at the given offset.
- */
-goog.dom.getNodeAtOffset = function(parent, offset, opt_result) {
- var stack = [parent], pos = 0, cur = null;
- while (stack.length > 0 && pos < offset) {
- cur = stack.pop();
- if (cur.nodeName in goog.dom.TAGS_TO_IGNORE_) {
- // ignore certain tags
- } else if (cur.nodeType == goog.dom.NodeType.TEXT) {
- var text = cur.nodeValue.replace(/(\r\n|\r|\n)/g, '').replace(/ +/g, ' ');
- pos += text.length;
- } else if (cur.nodeName in goog.dom.PREDEFINED_TAG_VALUES_) {
- pos += goog.dom.PREDEFINED_TAG_VALUES_[cur.nodeName].length;
- } else {
- for (var i = cur.childNodes.length - 1; i >= 0; i--) {
- stack.push(cur.childNodes[i]);
- }
- }
- }
- if (goog.isObject(opt_result)) {
- opt_result.remainder = cur ? cur.nodeValue.length + offset - pos - 1 : 0;
- opt_result.node = cur;
- }
-
- return cur;
-};
-
-
-/**
- * Returns true if the object is a {@code NodeList}. To qualify as a NodeList,
- * the object must have a numeric length property and an item function (which
- * has type 'string' on IE for some reason).
- * @param {Object} val Object to test.
- * @return {boolean} Whether the object is a NodeList.
- */
-goog.dom.isNodeList = function(val) {
- // TODO(attila): Now the isNodeList is part of goog.dom we can use
- // goog.userAgent to make this simpler.
- // A NodeList must have a length property of type 'number' on all platforms.
- if (val && typeof val.length == 'number') {
- // A NodeList is an object everywhere except Safari, where it's a function.
- if (goog.isObject(val)) {
- // A NodeList must have an item function (on non-IE platforms) or an item
- // property of type 'string' (on IE).
- return typeof val.item == 'function' || typeof val.item == 'string';
- } else if (goog.isFunction(val)) {
- // On Safari, a NodeList is a function with an item property that is also
- // a function.
- return typeof val.item == 'function';
- }
- }
-
- // Not a NodeList.
- return false;
-};
-
-
-/**
- * Walks up the DOM hierarchy returning the first ancestor that has the passed
- * tag name and/or class name. If the passed element matches the specified
- * criteria, the element itself is returned.
- * @param {Node} element The DOM node to start with.
- * @param {?(goog.dom.TagName<T>|string)=} opt_tag The tag name to match (or
- * null/undefined to match only based on class name).
- * @param {?string=} opt_class The class name to match (or null/undefined to
- * match only based on tag name).
- * @param {number=} opt_maxSearchSteps Maximum number of levels to search up the
- * dom.
- * @return {?R} The first ancestor that matches the passed criteria, or
- * null if no match is found. The return type is {?Element} if opt_tag is
- * not a member of goog.dom.TagName or a more specific type if it is (e.g.
- * {?HTMLAnchorElement} for goog.dom.TagName.A).
- * @template T
- * @template R := cond(isUnknown(T), 'Element', T) =:
- */
-goog.dom.getAncestorByTagNameAndClass = function(
- element, opt_tag, opt_class, opt_maxSearchSteps) {
- if (!opt_tag && !opt_class) {
- return null;
- }
- var tagName = opt_tag ? String(opt_tag).toUpperCase() : null;
- return /** @type {Element} */ (goog.dom.getAncestor(element, function(node) {
- return (!tagName || node.nodeName == tagName) &&
- (!opt_class ||
- goog.isString(node.className) &&
- goog.array.contains(node.className.split(/\s+/), opt_class));
- }, true, opt_maxSearchSteps));
-};
-
-
-/**
- * Walks up the DOM hierarchy returning the first ancestor that has the passed
- * class name. If the passed element matches the specified criteria, the
- * element itself is returned.
- * @param {Node} element The DOM node to start with.
- * @param {string} className The class name to match.
- * @param {number=} opt_maxSearchSteps Maximum number of levels to search up the
- * dom.
- * @return {Element} The first ancestor that matches the passed criteria, or
- * null if none match.
- */
-goog.dom.getAncestorByClass = function(element, className, opt_maxSearchSteps) {
- return goog.dom.getAncestorByTagNameAndClass(
- element, null, className, opt_maxSearchSteps);
-};
-
-
-/**
- * Walks up the DOM hierarchy returning the first ancestor that passes the
- * matcher function.
- * @param {Node} element The DOM node to start with.
- * @param {function(Node) : boolean} matcher A function that returns true if the
- * passed node matches the desired criteria.
- * @param {boolean=} opt_includeNode If true, the node itself is included in
- * the search (the first call to the matcher will pass startElement as
- * the node to test).
- * @param {number=} opt_maxSearchSteps Maximum number of levels to search up the
- * dom.
- * @return {Node} DOM node that matched the matcher, or null if there was
- * no match.
- */
-goog.dom.getAncestor = function(
- element, matcher, opt_includeNode, opt_maxSearchSteps) {
- if (element && !opt_includeNode) {
- element = element.parentNode;
- }
- var steps = 0;
- while (element &&
- (opt_maxSearchSteps == null || steps <= opt_maxSearchSteps)) {
- goog.asserts.assert(element.name != 'parentNode');
- if (matcher(element)) {
- return element;
- }
- element = element.parentNode;
- steps++;
- }
- // Reached the root of the DOM without a match
- return null;
-};
-
-
-/**
- * Determines the active element in the given document.
- * @param {Document} doc The document to look in.
- * @return {Element} The active element.
- */
-goog.dom.getActiveElement = function(doc) {
- try {
- return doc && doc.activeElement;
- } catch (e) {
- // NOTE(nicksantos): Sometimes, evaluating document.activeElement in IE
- // throws an exception. I'm not 100% sure why, but I suspect it chokes
- // on document.activeElement if the activeElement has been recently
- // removed from the DOM by a JS operation.
- //
- // We assume that an exception here simply means
- // "there is no active element."
- }
-
- return null;
-};
-
-
-/**
- * Gives the current devicePixelRatio.
- *
- * By default, this is the value of window.devicePixelRatio (which should be
- * preferred if present).
- *
- * If window.devicePixelRatio is not present, the ratio is calculated with
- * window.matchMedia, if present. Otherwise, gives 1.0.
- *
- * Some browsers (including Chrome) consider the browser zoom level in the pixel
- * ratio, so the value may change across multiple calls.
- *
- * @return {number} The number of actual pixels per virtual pixel.
- */
-goog.dom.getPixelRatio = function() {
- var win = goog.dom.getWindow();
- if (goog.isDef(win.devicePixelRatio)) {
- return win.devicePixelRatio;
- } else if (win.matchMedia) {
- // Should be for IE10 and FF6-17 (this basically clamps to lower)
- // Note that the order of these statements is important
- return goog.dom.matchesPixelRatio_(3) || goog.dom.matchesPixelRatio_(2) ||
- goog.dom.matchesPixelRatio_(1.5) || goog.dom.matchesPixelRatio_(1) ||
- .75;
- }
- return 1;
-};
-
-
-/**
- * Calculates a mediaQuery to check if the current device supports the
- * given actual to virtual pixel ratio.
- * @param {number} pixelRatio The ratio of actual pixels to virtual pixels.
- * @return {number} pixelRatio if applicable, otherwise 0.
- * @private
- */
-goog.dom.matchesPixelRatio_ = function(pixelRatio) {
- var win = goog.dom.getWindow();
- /**
- * Due to the 1:96 fixed ratio of CSS in to CSS px, 1dppx is equivalent to
- * 96dpi.
- * @const {number}
- */
- var dpiPerDppx = 96;
- var query =
- // FF16-17
- '(min-resolution: ' + pixelRatio + 'dppx),' +
- // FF6-15
- '(min--moz-device-pixel-ratio: ' + pixelRatio + '),' +
- // IE10 (this works for the two browsers above too but I don't want to
- // trust the 1:96 fixed ratio magic)
- '(min-resolution: ' + (pixelRatio * dpiPerDppx) + 'dpi)';
- return win.matchMedia(query).matches ? pixelRatio : 0;
-};
-
-
-/**
- * Gets '2d' context of a canvas. Shortcut for canvas.getContext('2d') with a
- * type information.
- * @param {!HTMLCanvasElement} canvas
- * @return {!CanvasRenderingContext2D}
- */
-goog.dom.getCanvasContext2D = function(canvas) {
- return /** @type {!CanvasRenderingContext2D} */ (canvas.getContext('2d'));
-};
-
-
-
-/**
- * Create an instance of a DOM helper with a new document object.
- * @param {Document=} opt_document Document object to associate with this
- * DOM helper.
- * @constructor
- */
-goog.dom.DomHelper = function(opt_document) {
- /**
- * Reference to the document object to use
- * @type {!Document}
- * @private
- */
- this.document_ = opt_document || goog.global.document || document;
-};
-
-
-/**
- * Gets the dom helper object for the document where the element resides.
- * @param {Node=} opt_node If present, gets the DomHelper for this node.
- * @return {!goog.dom.DomHelper} The DomHelper.
- */
-goog.dom.DomHelper.prototype.getDomHelper = goog.dom.getDomHelper;
-
-
-/**
- * Sets the document object.
- * @param {!Document} document Document object.
- */
-goog.dom.DomHelper.prototype.setDocument = function(document) {
- this.document_ = document;
-};
-
-
-/**
- * Gets the document object being used by the dom library.
- * @return {!Document} Document object.
- */
-goog.dom.DomHelper.prototype.getDocument = function() {
- return this.document_;
-};
-
-
-/**
- * Alias for {@code getElementById}. If a DOM node is passed in then we just
- * return that.
- * @param {string|Element} element Element ID or a DOM node.
- * @return {Element} The element with the given ID, or the node passed in.
- */
-goog.dom.DomHelper.prototype.getElement = function(element) {
- return goog.dom.getElementHelper_(this.document_, element);
-};
-
-
-/**
- * Gets an element by id, asserting that the element is found.
- *
- * This is used when an element is expected to exist, and should fail with
- * an assertion error if it does not (if assertions are enabled).
- *
- * @param {string} id Element ID.
- * @return {!Element} The element with the given ID, if it exists.
- */
-goog.dom.DomHelper.prototype.getRequiredElement = function(id) {
- return goog.dom.getRequiredElementHelper_(this.document_, id);
-};
-
-
-/**
- * Alias for {@code getElement}.
- * @param {string|Element} element Element ID or a DOM node.
- * @return {Element} The element with the given ID, or the node passed in.
- * @deprecated Use {@link goog.dom.DomHelper.prototype.getElement} instead.
- */
-goog.dom.DomHelper.prototype.$ = goog.dom.DomHelper.prototype.getElement;
-
-
-/**
- * Gets elements by tag name.
- * @param {!goog.dom.TagName<T>} tagName
- * @param {(!Document|!Element)=} opt_parent Parent element or document where to
- * look for elements. Defaults to document of this DomHelper.
- * @return {!NodeList<R>} List of elements. The members of the list are
- * {!Element} if tagName is not a member of goog.dom.TagName or more
- * specific types if it is (e.g. {!HTMLAnchorElement} for
- * goog.dom.TagName.A).
- * @template T
- * @template R := cond(isUnknown(T), 'Element', T) =:
- */
-goog.dom.DomHelper.prototype.getElementsByTagName =
- function(tagName, opt_parent) {
- var parent = opt_parent || this.document_;
- return parent.getElementsByTagName(String(tagName));
-};
-
-
-/**
- * Looks up elements by both tag and class name, using browser native functions
- * ({@code querySelectorAll}, {@code getElementsByTagName} or
- * {@code getElementsByClassName}) where possible. The returned array is a live
- * NodeList or a static list depending on the code path taken.
- *
- * @see goog.dom.query
- *
- * @param {(string|?goog.dom.TagName<T>)=} opt_tag Element tag name or * for all
- * tags.
- * @param {?string=} opt_class Optional class name.
- * @param {(Document|Element)=} opt_el Optional element to look in.
- * @return {!IArrayLike<R>} Array-like list of elements (only a length property
- * and numerical indices are guaranteed to exist). The members of the array
- * are {!Element} if opt_tag is not a member of goog.dom.TagName or more
- * specific types if it is (e.g. {!HTMLAnchorElement} for
- * goog.dom.TagName.A).
- * @template T
- * @template R := cond(isUnknown(T), 'Element', T) =:
- */
-goog.dom.DomHelper.prototype.getElementsByTagNameAndClass = function(
- opt_tag, opt_class, opt_el) {
- return goog.dom.getElementsByTagNameAndClass_(
- this.document_, opt_tag, opt_class, opt_el);
-};
-
-
-/**
- * Gets the first element matching the tag and the class.
- *
- * @param {(string|?goog.dom.TagName<T>)=} opt_tag Element tag name.
- * @param {?string=} opt_class Optional class name.
- * @param {(Document|Element)=} opt_el Optional element to look in.
- * @return {?R} Reference to a DOM node. The return type is {?Element} if
- * tagName is a string or a more specific type if it is a member of
- * goog.dom.TagName (e.g. {?HTMLAnchorElement} for goog.dom.TagName.A).
- * @template T
- * @template R := cond(isUnknown(T), 'Element', T) =:
- */
-goog.dom.DomHelper.prototype.getElementByTagNameAndClass = function(
- opt_tag, opt_class, opt_el) {
- return goog.dom.getElementByTagNameAndClass_(
- this.document_, opt_tag, opt_class, opt_el);
-};
-
-
-/**
- * Returns an array of all the elements with the provided className.
- * @see {goog.dom.query}
- * @param {string} className the name of the class to look for.
- * @param {Element|Document=} opt_el Optional element to look in.
- * @return {!IArrayLike<!Element>} The items found with the class name provided.
- */
-goog.dom.DomHelper.prototype.getElementsByClass = function(className, opt_el) {
- var doc = opt_el || this.document_;
- return goog.dom.getElementsByClass(className, doc);
-};
-
-
-/**
- * Returns the first element we find matching the provided class name.
- * @see {goog.dom.query}
- * @param {string} className the name of the class to look for.
- * @param {(Element|Document)=} opt_el Optional element to look in.
- * @return {Element} The first item found with the class name provided.
- */
-goog.dom.DomHelper.prototype.getElementByClass = function(className, opt_el) {
- var doc = opt_el || this.document_;
- return goog.dom.getElementByClass(className, doc);
-};
-
-
-/**
- * Ensures an element with the given className exists, and then returns the
- * first element with the provided className.
- * @see {goog.dom.query}
- * @param {string} className the name of the class to look for.
- * @param {(!Element|!Document)=} opt_root Optional element or document to look
- * in.
- * @return {!Element} The first item found with the class name provided.
- * @throws {goog.asserts.AssertionError} Thrown if no element is found.
- */
-goog.dom.DomHelper.prototype.getRequiredElementByClass = function(
- className, opt_root) {
- var root = opt_root || this.document_;
- return goog.dom.getRequiredElementByClass(className, root);
-};
-
-
-/**
- * Alias for {@code getElementsByTagNameAndClass}.
- * @deprecated Use DomHelper getElementsByTagNameAndClass.
- * @see goog.dom.query
- *
- * @param {(string|?goog.dom.TagName<T>)=} opt_tag Element tag name.
- * @param {?string=} opt_class Optional class name.
- * @param {Element=} opt_el Optional element to look in.
- * @return {!IArrayLike<R>} Array-like list of elements (only a length property
- * and numerical indices are guaranteed to exist). The members of the array
- * are {!Element} if opt_tag is a string or more specific types if it is
- * a member of goog.dom.TagName (e.g. {!HTMLAnchorElement} for
- * goog.dom.TagName.A).
- * @template T
- * @template R := cond(isUnknown(T), 'Element', T) =:
- */
-goog.dom.DomHelper.prototype.$$ =
- goog.dom.DomHelper.prototype.getElementsByTagNameAndClass;
-
-
-/**
- * Sets a number of properties on a node.
- * @param {Element} element DOM node to set properties on.
- * @param {Object} properties Hash of property:value pairs.
- */
-goog.dom.DomHelper.prototype.setProperties = goog.dom.setProperties;
-
-
-/**
- * Gets the dimensions of the viewport.
- * @param {Window=} opt_window Optional window element to test. Defaults to
- * the window of the Dom Helper.
- * @return {!goog.math.Size} Object with values 'width' and 'height'.
- */
-goog.dom.DomHelper.prototype.getViewportSize = function(opt_window) {
- // TODO(arv): This should not take an argument. That breaks the rule of a
- // a DomHelper representing a single frame/window/document.
- return goog.dom.getViewportSize(opt_window || this.getWindow());
-};
-
-
-/**
- * Calculates the height of the document.
- *
- * @return {number} The height of the document.
- */
-goog.dom.DomHelper.prototype.getDocumentHeight = function() {
- return goog.dom.getDocumentHeight_(this.getWindow());
-};
-
-
-/**
- * Typedef for use with goog.dom.createDom and goog.dom.append.
- * @typedef {Object|string|Array|NodeList}
- */
-goog.dom.Appendable;
-
-
-/**
- * Returns a dom node with a set of attributes. This function accepts varargs
- * for subsequent nodes to be added. Subsequent nodes will be added to the
- * first node as childNodes.
- *
- * So:
- * <code>createDom(goog.dom.TagName.DIV, null, createDom(goog.dom.TagName.P),
- * createDom(goog.dom.TagName.P));</code> would return a div with two child
- * paragraphs
- *
- * An easy way to move all child nodes of an existing element to a new parent
- * element is:
- * <code>createDom(goog.dom.TagName.DIV, null, oldElement.childNodes);</code>
- * which will remove all child nodes from the old element and add them as
- * child nodes of the new DIV.
- *
- * @param {string|!goog.dom.TagName<T>} tagName Tag to create.
- * @param {?Object|?Array<string>|string=} opt_attributes If object, then a map
- * of name-value pairs for attributes. If a string, then this is the
- * className of the new element. If an array, the elements will be joined
- * together as the className of the new element.
- * @param {...goog.dom.Appendable} var_args Further DOM nodes or
- * strings for text nodes. If one of the var_args is an array or
- * NodeList, its elements will be added as childNodes instead.
- * @return {R} Reference to a DOM node. The return type is {!Element} if tagName
- * is a string or a more specific type if it is a member of
- * goog.dom.TagName (e.g. {!HTMLAnchorElement} for goog.dom.TagName.A).
- * @template T
- * @template R := cond(isUnknown(T), 'Element', T) =:
- */
-goog.dom.DomHelper.prototype.createDom = function(
- tagName, opt_attributes, var_args) {
- return goog.dom.createDom_(this.document_, arguments);
-};
-
-
-/**
- * Alias for {@code createDom}.
- * @param {string|!goog.dom.TagName<T>} tagName Tag to create.
- * @param {?Object|?Array<string>|string=} opt_attributes If object, then a map
- * of name-value pairs for attributes. If a string, then this is the
- * className of the new element. If an array, the elements will be joined
- * together as the className of the new element.
- * @param {...goog.dom.Appendable} var_args Further DOM nodes or strings for
- * text nodes. If one of the var_args is an array, its children will be
- * added as childNodes instead.
- * @return {R} Reference to a DOM node. The return type is {!Element} if tagName
- * is a string or a more specific type if it is a member of
- * goog.dom.TagName (e.g. {!HTMLAnchorElement} for goog.dom.TagName.A).
- * @template T
- * @template R := cond(isUnknown(T), 'Element', T) =:
- * @deprecated Use {@link goog.dom.DomHelper.prototype.createDom} instead.
- */
-goog.dom.DomHelper.prototype.$dom = goog.dom.DomHelper.prototype.createDom;
-
-
-/**
- * Creates a new element.
- * @param {string|!goog.dom.TagName<T>} name Tag to create.
- * @return {R} The new element. The return type is {!Element} if name is
- * a string or a more specific type if it is a member of goog.dom.TagName
- * (e.g. {!HTMLAnchorElement} for goog.dom.TagName.A).
- * @template T
- * @template R := cond(isUnknown(T), 'Element', T) =:
- */
-goog.dom.DomHelper.prototype.createElement = function(name) {
- return goog.dom.createElement_(this.document_, name);
-};
-
-
-/**
- * Creates a new text node.
- * @param {number|string} content Content.
- * @return {!Text} The new text node.
- */
-goog.dom.DomHelper.prototype.createTextNode = function(content) {
- return this.document_.createTextNode(String(content));
-};
-
-
-/**
- * Create a table.
- * @param {number} rows The number of rows in the table. Must be >= 1.
- * @param {number} columns The number of columns in the table. Must be >= 1.
- * @param {boolean=} opt_fillWithNbsp If true, fills table entries with
- * {@code goog.string.Unicode.NBSP} characters.
- * @return {!HTMLElement} The created table.
- */
-goog.dom.DomHelper.prototype.createTable = function(
- rows, columns, opt_fillWithNbsp) {
- return goog.dom.createTable_(
- this.document_, rows, columns, !!opt_fillWithNbsp);
-};
-
-
-/**
- * Converts an HTML into a node or a document fragment. A single Node is used if
- * {@code html} only generates a single node. If {@code html} generates multiple
- * nodes then these are put inside a {@code DocumentFragment}. This is a safe
- * version of {@code goog.dom.DomHelper#htmlToDocumentFragment} which is now
- * deleted.
- * @param {!goog.html.SafeHtml} html The HTML markup to convert.
- * @return {!Node} The resulting node.
- */
-goog.dom.DomHelper.prototype.safeHtmlToNode = function(html) {
- return goog.dom.safeHtmlToNode_(this.document_, html);
-};
-
-
-/**
- * Returns true if the browser is in "CSS1-compatible" (standards-compliant)
- * mode, false otherwise.
- * @return {boolean} True if in CSS1-compatible mode.
- */
-goog.dom.DomHelper.prototype.isCss1CompatMode = function() {
- return goog.dom.isCss1CompatMode_(this.document_);
-};
-
-
-/**
- * Gets the window object associated with the document.
- * @return {!Window} The window associated with the given document.
- */
-goog.dom.DomHelper.prototype.getWindow = function() {
- return goog.dom.getWindow_(this.document_);
-};
-
-
-/**
- * Gets the document scroll element.
- * @return {!Element} Scrolling element.
- */
-goog.dom.DomHelper.prototype.getDocumentScrollElement = function() {
- return goog.dom.getDocumentScrollElement_(this.document_);
-};
-
-
-/**
- * Gets the document scroll distance as a coordinate object.
- * @return {!goog.math.Coordinate} Object with properties 'x' and 'y'.
- */
-goog.dom.DomHelper.prototype.getDocumentScroll = function() {
- return goog.dom.getDocumentScroll_(this.document_);
-};
-
-
-/**
- * Determines the active element in the given document.
- * @param {Document=} opt_doc The document to look in.
- * @return {Element} The active element.
- */
-goog.dom.DomHelper.prototype.getActiveElement = function(opt_doc) {
- return goog.dom.getActiveElement(opt_doc || this.document_);
-};
-
-
-/**
- * Appends a child to a node.
- * @param {Node} parent Parent.
- * @param {Node} child Child.
- */
-goog.dom.DomHelper.prototype.appendChild = goog.dom.appendChild;
-
-
-/**
- * Appends a node with text or other nodes.
- * @param {!Node} parent The node to append nodes to.
- * @param {...goog.dom.Appendable} var_args The things to append to the node.
- * If this is a Node it is appended as is.
- * If this is a string then a text node is appended.
- * If this is an array like object then fields 0 to length - 1 are appended.
- */
-goog.dom.DomHelper.prototype.append = goog.dom.append;
-
-
-/**
- * Determines if the given node can contain children, intended to be used for
- * HTML generation.
- *
- * @param {Node} node The node to check.
- * @return {boolean} Whether the node can contain children.
- */
-goog.dom.DomHelper.prototype.canHaveChildren = goog.dom.canHaveChildren;
-
-
-/**
- * Removes all the child nodes on a DOM node.
- * @param {Node} node Node to remove children from.
- */
-goog.dom.DomHelper.prototype.removeChildren = goog.dom.removeChildren;
-
-
-/**
- * Inserts a new node before an existing reference node (i.e., as the previous
- * sibling). If the reference node has no parent, then does nothing.
- * @param {Node} newNode Node to insert.
- * @param {Node} refNode Reference node to insert before.
- */
-goog.dom.DomHelper.prototype.insertSiblingBefore = goog.dom.insertSiblingBefore;
-
-
-/**
- * Inserts a new node after an existing reference node (i.e., as the next
- * sibling). If the reference node has no parent, then does nothing.
- * @param {Node} newNode Node to insert.
- * @param {Node} refNode Reference node to insert after.
- */
-goog.dom.DomHelper.prototype.insertSiblingAfter = goog.dom.insertSiblingAfter;
-
-
-/**
- * Insert a child at a given index. If index is larger than the number of child
- * nodes that the parent currently has, the node is inserted as the last child
- * node.
- * @param {Element} parent The element into which to insert the child.
- * @param {Node} child The element to insert.
- * @param {number} index The index at which to insert the new child node. Must
- * not be negative.
- */
-goog.dom.DomHelper.prototype.insertChildAt = goog.dom.insertChildAt;
-
-
-/**
- * Removes a node from its parent.
- * @param {Node} node The node to remove.
- * @return {Node} The node removed if removed; else, null.
- */
-goog.dom.DomHelper.prototype.removeNode = goog.dom.removeNode;
-
-
-/**
- * Replaces a node in the DOM tree. Will do nothing if {@code oldNode} has no
- * parent.
- * @param {Node} newNode Node to insert.
- * @param {Node} oldNode Node to replace.
- */
-goog.dom.DomHelper.prototype.replaceNode = goog.dom.replaceNode;
-
-
-/**
- * Flattens an element. That is, removes it and replace it with its children.
- * @param {Element} element The element to flatten.
- * @return {Element|undefined} The original element, detached from the document
- * tree, sans children, or undefined if the element was already not in the
- * document.
- */
-goog.dom.DomHelper.prototype.flattenElement = goog.dom.flattenElement;
-
-
-/**
- * Returns an array containing just the element children of the given element.
- * @param {Element} element The element whose element children we want.
- * @return {!(Array<!Element>|NodeList<!Element>)} An array or array-like list
- * of just the element children of the given element.
- */
-goog.dom.DomHelper.prototype.getChildren = goog.dom.getChildren;
-
-
-/**
- * Returns the first child node that is an element.
- * @param {Node} node The node to get the first child element of.
- * @return {Element} The first child node of {@code node} that is an element.
- */
-goog.dom.DomHelper.prototype.getFirstElementChild =
- goog.dom.getFirstElementChild;
-
-
-/**
- * Returns the last child node that is an element.
- * @param {Node} node The node to get the last child element of.
- * @return {Element} The last child node of {@code node} that is an element.
- */
-goog.dom.DomHelper.prototype.getLastElementChild = goog.dom.getLastElementChild;
-
-
-/**
- * Returns the first next sibling that is an element.
- * @param {Node} node The node to get the next sibling element of.
- * @return {Element} The next sibling of {@code node} that is an element.
- */
-goog.dom.DomHelper.prototype.getNextElementSibling =
- goog.dom.getNextElementSibling;
-
-
-/**
- * Returns the first previous sibling that is an element.
- * @param {Node} node The node to get the previous sibling element of.
- * @return {Element} The first previous sibling of {@code node} that is
- * an element.
- */
-goog.dom.DomHelper.prototype.getPreviousElementSibling =
- goog.dom.getPreviousElementSibling;
-
-
-/**
- * Returns the next node in source order from the given node.
- * @param {Node} node The node.
- * @return {Node} The next node in the DOM tree, or null if this was the last
- * node.
- */
-goog.dom.DomHelper.prototype.getNextNode = goog.dom.getNextNode;
-
-
-/**
- * Returns the previous node in source order from the given node.
- * @param {Node} node The node.
- * @return {Node} The previous node in the DOM tree, or null if this was the
- * first node.
- */
-goog.dom.DomHelper.prototype.getPreviousNode = goog.dom.getPreviousNode;
-
-
-/**
- * Whether the object looks like a DOM node.
- * @param {?} obj The object being tested for node likeness.
- * @return {boolean} Whether the object looks like a DOM node.
- */
-goog.dom.DomHelper.prototype.isNodeLike = goog.dom.isNodeLike;
-
-
-/**
- * Whether the object looks like an Element.
- * @param {?} obj The object being tested for Element likeness.
- * @return {boolean} Whether the object looks like an Element.
- */
-goog.dom.DomHelper.prototype.isElement = goog.dom.isElement;
-
-
-/**
- * Returns true if the specified value is a Window object. This includes the
- * global window for HTML pages, and iframe windows.
- * @param {?} obj Variable to test.
- * @return {boolean} Whether the variable is a window.
- */
-goog.dom.DomHelper.prototype.isWindow = goog.dom.isWindow;
-
-
-/**
- * Returns an element's parent, if it's an Element.
- * @param {Element} element The DOM element.
- * @return {Element} The parent, or null if not an Element.
- */
-goog.dom.DomHelper.prototype.getParentElement = goog.dom.getParentElement;
-
-
-/**
- * Whether a node contains another node.
- * @param {Node} parent The node that should contain the other node.
- * @param {Node} descendant The node to test presence of.
- * @return {boolean} Whether the parent node contains the descendent node.
- */
-goog.dom.DomHelper.prototype.contains = goog.dom.contains;
-
-
-/**
- * Compares the document order of two nodes, returning 0 if they are the same
- * node, a negative number if node1 is before node2, and a positive number if
- * node2 is before node1. Note that we compare the order the tags appear in the
- * document so in the tree <b><i>text</i></b> the B node is considered to be
- * before the I node.
- *
- * @param {Node} node1 The first node to compare.
- * @param {Node} node2 The second node to compare.
- * @return {number} 0 if the nodes are the same node, a negative number if node1
- * is before node2, and a positive number if node2 is before node1.
- */
-goog.dom.DomHelper.prototype.compareNodeOrder = goog.dom.compareNodeOrder;
-
-
-/**
- * Find the deepest common ancestor of the given nodes.
- * @param {...Node} var_args The nodes to find a common ancestor of.
- * @return {Node} The common ancestor of the nodes, or null if there is none.
- * null will only be returned if two or more of the nodes are from different
- * documents.
- */
-goog.dom.DomHelper.prototype.findCommonAncestor = goog.dom.findCommonAncestor;
-
-
-/**
- * Returns the owner document for a node.
- * @param {Node} node The node to get the document for.
- * @return {!Document} The document owning the node.
- */
-goog.dom.DomHelper.prototype.getOwnerDocument = goog.dom.getOwnerDocument;
-
-
-/**
- * Cross browser function for getting the document element of an iframe.
- * @param {Element} iframe Iframe element.
- * @return {!Document} The frame content document.
- */
-goog.dom.DomHelper.prototype.getFrameContentDocument =
- goog.dom.getFrameContentDocument;
-
-
-/**
- * Cross browser function for getting the window of a frame or iframe.
- * @param {Element} frame Frame element.
- * @return {Window} The window associated with the given frame.
- */
-goog.dom.DomHelper.prototype.getFrameContentWindow =
- goog.dom.getFrameContentWindow;
-
-
-/**
- * Sets the text content of a node, with cross-browser support.
- * @param {Node} node The node to change the text content of.
- * @param {string|number} text The value that should replace the node's content.
- */
-goog.dom.DomHelper.prototype.setTextContent = goog.dom.setTextContent;
-
-
-/**
- * Gets the outerHTML of a node, which islike innerHTML, except that it
- * actually contains the HTML of the node itself.
- * @param {Element} element The element to get the HTML of.
- * @return {string} The outerHTML of the given element.
- */
-goog.dom.DomHelper.prototype.getOuterHtml = goog.dom.getOuterHtml;
-
-
-/**
- * Finds the first descendant node that matches the filter function. This does
- * a depth first search.
- * @param {Node} root The root of the tree to search.
- * @param {function(Node) : boolean} p The filter function.
- * @return {Node|undefined} The found node or undefined if none is found.
- */
-goog.dom.DomHelper.prototype.findNode = goog.dom.findNode;
-
-
-/**
- * Finds all the descendant nodes that matches the filter function. This does a
- * depth first search.
- * @param {Node} root The root of the tree to search.
- * @param {function(Node) : boolean} p The filter function.
- * @return {Array<Node>} The found nodes or an empty array if none are found.
- */
-goog.dom.DomHelper.prototype.findNodes = goog.dom.findNodes;
-
-
-/**
- * Returns true if the element has a tab index that allows it to receive
- * keyboard focus (tabIndex >= 0), false otherwise. Note that some elements
- * natively support keyboard focus, even if they have no tab index.
- * @param {!Element} element Element to check.
- * @return {boolean} Whether the element has a tab index that allows keyboard
- * focus.
- */
-goog.dom.DomHelper.prototype.isFocusableTabIndex = goog.dom.isFocusableTabIndex;
-
-
-/**
- * Enables or disables keyboard focus support on the element via its tab index.
- * Only elements for which {@link goog.dom.isFocusableTabIndex} returns true
- * (or elements that natively support keyboard focus, like form elements) can
- * receive keyboard focus. See http://go/tabindex for more info.
- * @param {Element} element Element whose tab index is to be changed.
- * @param {boolean} enable Whether to set or remove a tab index on the element
- * that supports keyboard focus.
- */
-goog.dom.DomHelper.prototype.setFocusableTabIndex =
- goog.dom.setFocusableTabIndex;
-
-
-/**
- * Returns true if the element can be focused, i.e. it has a tab index that
- * allows it to receive keyboard focus (tabIndex >= 0), or it is an element
- * that natively supports keyboard focus.
- * @param {!Element} element Element to check.
- * @return {boolean} Whether the element allows keyboard focus.
- */
-goog.dom.DomHelper.prototype.isFocusable = goog.dom.isFocusable;
-
-
-/**
- * Returns the text contents of the current node, without markup. New lines are
- * stripped and whitespace is collapsed, such that each character would be
- * visible.
- *
- * In browsers that support it, innerText is used. Other browsers attempt to
- * simulate it via node traversal. Line breaks are canonicalized in IE.
- *
- * @param {Node} node The node from which we are getting content.
- * @return {string} The text content.
- */
-goog.dom.DomHelper.prototype.getTextContent = goog.dom.getTextContent;
-
-
-/**
- * Returns the text length of the text contained in a node, without markup. This
- * is equivalent to the selection length if the node was selected, or the number
- * of cursor movements to traverse the node. Images & BRs take one space. New
- * lines are ignored.
- *
- * @param {Node} node The node whose text content length is being calculated.
- * @return {number} The length of {@code node}'s text content.
- */
-goog.dom.DomHelper.prototype.getNodeTextLength = goog.dom.getNodeTextLength;
-
-
-/**
- * Returns the text offset of a node relative to one of its ancestors. The text
- * length is the same as the length calculated by
- * {@code goog.dom.getNodeTextLength}.
- *
- * @param {Node} node The node whose offset is being calculated.
- * @param {Node=} opt_offsetParent Defaults to the node's owner document's body.
- * @return {number} The text offset.
- */
-goog.dom.DomHelper.prototype.getNodeTextOffset = goog.dom.getNodeTextOffset;
-
-
-/**
- * Returns the node at a given offset in a parent node. If an object is
- * provided for the optional third parameter, the node and the remainder of the
- * offset will stored as properties of this object.
- * @param {Node} parent The parent node.
- * @param {number} offset The offset into the parent node.
- * @param {Object=} opt_result Object to be used to store the return value. The
- * return value will be stored in the form {node: Node, remainder: number}
- * if this object is provided.
- * @return {Node} The node at the given offset.
- */
-goog.dom.DomHelper.prototype.getNodeAtOffset = goog.dom.getNodeAtOffset;
-
-
-/**
- * Returns true if the object is a {@code NodeList}. To qualify as a NodeList,
- * the object must have a numeric length property and an item function (which
- * has type 'string' on IE for some reason).
- * @param {Object} val Object to test.
- * @return {boolean} Whether the object is a NodeList.
- */
-goog.dom.DomHelper.prototype.isNodeList = goog.dom.isNodeList;
-
-
-/**
- * Walks up the DOM hierarchy returning the first ancestor that has the passed
- * tag name and/or class name. If the passed element matches the specified
- * criteria, the element itself is returned.
- * @param {Node} element The DOM node to start with.
- * @param {?(goog.dom.TagName<T>|string)=} opt_tag The tag name to match (or
- * null/undefined to match only based on class name).
- * @param {?string=} opt_class The class name to match (or null/undefined to
- * match only based on tag name).
- * @param {number=} opt_maxSearchSteps Maximum number of levels to search up the
- * dom.
- * @return {?R} The first ancestor that matches the passed criteria, or
- * null if no match is found. The return type is {?Element} if opt_tag is
- * not a member of goog.dom.TagName or a more specific type if it is (e.g.
- * {?HTMLAnchorElement} for goog.dom.TagName.A).
- * @template T
- * @template R := cond(isUnknown(T), 'Element', T) =:
- */
-goog.dom.DomHelper.prototype.getAncestorByTagNameAndClass =
- goog.dom.getAncestorByTagNameAndClass;
-
-
-/**
- * Walks up the DOM hierarchy returning the first ancestor that has the passed
- * class name. If the passed element matches the specified criteria, the
- * element itself is returned.
- * @param {Node} element The DOM node to start with.
- * @param {string} class The class name to match.
- * @param {number=} opt_maxSearchSteps Maximum number of levels to search up the
- * dom.
- * @return {Element} The first ancestor that matches the passed criteria, or
- * null if none match.
- */
-goog.dom.DomHelper.prototype.getAncestorByClass = goog.dom.getAncestorByClass;
-
-
-/**
- * Walks up the DOM hierarchy returning the first ancestor that passes the
- * matcher function.
- * @param {Node} element The DOM node to start with.
- * @param {function(Node) : boolean} matcher A function that returns true if the
- * passed node matches the desired criteria.
- * @param {boolean=} opt_includeNode If true, the node itself is included in
- * the search (the first call to the matcher will pass startElement as
- * the node to test).
- * @param {number=} opt_maxSearchSteps Maximum number of levels to search up the
- * dom.
- * @return {Node} DOM node that matched the matcher, or null if there was
- * no match.
- */
-goog.dom.DomHelper.prototype.getAncestor = goog.dom.getAncestor;
-
-
-/**
- * Gets '2d' context of a canvas. Shortcut for canvas.getContext('2d') with a
- * type information.
- * @param {!HTMLCanvasElement} canvas
- * @return {!CanvasRenderingContext2D}
- */
-goog.dom.DomHelper.prototype.getCanvasContext2D = goog.dom.getCanvasContext2D;
diff --git a/static/src/assets/viz/2/goog/dom/htmlelement.js b/static/src/assets/viz/2/goog/dom/htmlelement.js
deleted file mode 100644
index c48f753..0000000
--- a/static/src/assets/viz/2/goog/dom/htmlelement.js
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright 2017 The Closure Library Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS-IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-goog.provide('goog.dom.HtmlElement');
-
-
-
-/**
- * This subclass of HTMLElement is used when only a HTMLElement is possible and
- * not any of its subclasses. Normally, a type can refer to an instance of
- * itself or an instance of any subtype. More concretely, if HTMLElement is used
- * then the compiler must assume that it might still be e.g. HTMLScriptElement.
- * With this, the type check knows that it couldn't be any special element.
- *
- * @constructor
- * @extends {HTMLElement}
- */
-goog.dom.HtmlElement = function() {};
diff --git a/static/src/assets/viz/2/goog/dom/nodetype.js b/static/src/assets/viz/2/goog/dom/nodetype.js
deleted file mode 100644
index cccb470..0000000
--- a/static/src/assets/viz/2/goog/dom/nodetype.js
+++ /dev/null
@@ -1,48 +0,0 @@
-// Copyright 2006 The Closure Library Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS-IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-/**
- * @fileoverview Definition of goog.dom.NodeType.
- */
-
-goog.provide('goog.dom.NodeType');
-
-
-/**
- * Constants for the nodeType attribute in the Node interface.
- *
- * These constants match those specified in the Node interface. These are
- * usually present on the Node object in recent browsers, but not in older
- * browsers (specifically, early IEs) and thus are given here.
- *
- * In some browsers (early IEs), these are not defined on the Node object,
- * so they are provided here.
- *
- * See http://www.w3.org/TR/DOM-Level-2-Core/core.html#ID-1950641247
- * @enum {number}
- */
-goog.dom.NodeType = {
- ELEMENT: 1,
- ATTRIBUTE: 2,
- TEXT: 3,
- CDATA_SECTION: 4,
- ENTITY_REFERENCE: 5,
- ENTITY: 6,
- PROCESSING_INSTRUCTION: 7,
- COMMENT: 8,
- DOCUMENT: 9,
- DOCUMENT_TYPE: 10,
- DOCUMENT_FRAGMENT: 11,
- NOTATION: 12
-};
diff --git a/static/src/assets/viz/2/goog/dom/safe.js b/static/src/assets/viz/2/goog/dom/safe.js
deleted file mode 100644
index b9390a0..0000000
--- a/static/src/assets/viz/2/goog/dom/safe.js
+++ /dev/null
@@ -1,458 +0,0 @@
-// Copyright 2013 The Closure Library Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS-IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-/**
- * @fileoverview Type-safe wrappers for unsafe DOM APIs.
- *
- * This file provides type-safe wrappers for DOM APIs that can result in
- * cross-site scripting (XSS) vulnerabilities, if the API is supplied with
- * untrusted (attacker-controlled) input. Instead of plain strings, the type
- * safe wrappers consume values of types from the goog.html package whose
- * contract promises that values are safe to use in the corresponding context.
- *
- * Hence, a program that exclusively uses the wrappers in this file (i.e., whose
- * only reference to security-sensitive raw DOM APIs are in this file) is
- * guaranteed to be free of XSS due to incorrect use of such DOM APIs (modulo
- * correctness of code that produces values of the respective goog.html types,
- * and absent code that violates type safety).
- *
- * For example, assigning to an element's .innerHTML property a string that is
- * derived (even partially) from untrusted input typically results in an XSS
- * vulnerability. The type-safe wrapper goog.dom.safe.setInnerHtml consumes a
- * value of type goog.html.SafeHtml, whose contract states that using its values
- * in a HTML context will not result in XSS. Hence a program that is free of
- * direct assignments to any element's innerHTML property (with the exception of
- * the assignment to .innerHTML in this file) is guaranteed to be free of XSS
- * due to assignment of untrusted strings to the innerHTML property.
- */
-
-goog.provide('goog.dom.safe');
-goog.provide('goog.dom.safe.InsertAdjacentHtmlPosition');
-
-goog.require('goog.asserts');
-goog.require('goog.dom.asserts');
-goog.require('goog.html.SafeHtml');
-goog.require('goog.html.SafeScript');
-goog.require('goog.html.SafeStyle');
-goog.require('goog.html.SafeUrl');
-goog.require('goog.html.TrustedResourceUrl');
-goog.require('goog.string');
-goog.require('goog.string.Const');
-
-
-/** @enum {string} */
-goog.dom.safe.InsertAdjacentHtmlPosition = {
- AFTERBEGIN: 'afterbegin',
- AFTEREND: 'afterend',
- BEFOREBEGIN: 'beforebegin',
- BEFOREEND: 'beforeend'
-};
-
-
-/**
- * Inserts known-safe HTML into a Node, at the specified position.
- * @param {!Node} node The node on which to call insertAdjacentHTML.
- * @param {!goog.dom.safe.InsertAdjacentHtmlPosition} position Position where
- * to insert the HTML.
- * @param {!goog.html.SafeHtml} html The known-safe HTML to insert.
- */
-goog.dom.safe.insertAdjacentHtml = function(node, position, html) {
- node.insertAdjacentHTML(position, goog.html.SafeHtml.unwrap(html));
-};
-
-
-/**
- * Tags not allowed in goog.dom.safe.setInnerHtml.
- * @private @const {!Object<string, boolean>}
- */
-goog.dom.safe.SET_INNER_HTML_DISALLOWED_TAGS_ = {
- 'MATH': true,
- 'SCRIPT': true,
- 'STYLE': true,
- 'SVG': true,
- 'TEMPLATE': true
-};
-
-
-/**
- * Assigns known-safe HTML to an element's innerHTML property.
- * @param {!Element} elem The element whose innerHTML is to be assigned to.
- * @param {!goog.html.SafeHtml} html The known-safe HTML to assign.
- * @throws {Error} If called with one of these tags: math, script, style, svg,
- * template.
- */
-goog.dom.safe.setInnerHtml = function(elem, html) {
- if (goog.asserts.ENABLE_ASSERTS) {
- var tagName = elem.tagName.toUpperCase();
- if (goog.dom.safe.SET_INNER_HTML_DISALLOWED_TAGS_[tagName]) {
- throw Error(
- 'goog.dom.safe.setInnerHtml cannot be used to set content of ' +
- elem.tagName + '.');
- }
- }
- elem.innerHTML = goog.html.SafeHtml.unwrap(html);
-};
-
-
-/**
- * Assigns known-safe HTML to an element's outerHTML property.
- * @param {!Element} elem The element whose outerHTML is to be assigned to.
- * @param {!goog.html.SafeHtml} html The known-safe HTML to assign.
- */
-goog.dom.safe.setOuterHtml = function(elem, html) {
- elem.outerHTML = goog.html.SafeHtml.unwrap(html);
-};
-
-
-/**
- * Sets the given element's style property to the contents of the provided
- * SafeStyle object.
- * @param {!Element} elem
- * @param {!goog.html.SafeStyle} style
- */
-goog.dom.safe.setStyle = function(elem, style) {
- elem.style.cssText = goog.html.SafeStyle.unwrap(style);
-};
-
-
-/**
- * Writes known-safe HTML to a document.
- * @param {!Document} doc The document to be written to.
- * @param {!goog.html.SafeHtml} html The known-safe HTML to assign.
- */
-goog.dom.safe.documentWrite = function(doc, html) {
- doc.write(goog.html.SafeHtml.unwrap(html));
-};
-
-
-/**
- * Safely assigns a URL to an anchor element's href property.
- *
- * If url is of type goog.html.SafeUrl, its value is unwrapped and assigned to
- * anchor's href property. If url is of type string however, it is first
- * sanitized using goog.html.SafeUrl.sanitize.
- *
- * Example usage:
- * goog.dom.safe.setAnchorHref(anchorEl, url);
- * which is a safe alternative to
- * anchorEl.href = url;
- * The latter can result in XSS vulnerabilities if url is a
- * user-/attacker-controlled value.
- *
- * @param {!HTMLAnchorElement} anchor The anchor element whose href property
- * is to be assigned to.
- * @param {string|!goog.html.SafeUrl} url The URL to assign.
- * @see goog.html.SafeUrl#sanitize
- */
-goog.dom.safe.setAnchorHref = function(anchor, url) {
- goog.dom.asserts.assertIsHTMLAnchorElement(anchor);
- /** @type {!goog.html.SafeUrl} */
- var safeUrl;
- if (url instanceof goog.html.SafeUrl) {
- safeUrl = url;
- } else {
- safeUrl = goog.html.SafeUrl.sanitizeAssertUnchanged(url);
- }
- anchor.href = goog.html.SafeUrl.unwrap(safeUrl);
-};
-
-
-/**
- * Safely assigns a URL to an image element's src property.
- *
- * If url is of type goog.html.SafeUrl, its value is unwrapped and assigned to
- * image's src property. If url is of type string however, it is first
- * sanitized using goog.html.SafeUrl.sanitize.
- *
- * @param {!HTMLImageElement} imageElement The image element whose src property
- * is to be assigned to.
- * @param {string|!goog.html.SafeUrl} url The URL to assign.
- * @see goog.html.SafeUrl#sanitize
- */
-goog.dom.safe.setImageSrc = function(imageElement, url) {
- goog.dom.asserts.assertIsHTMLImageElement(imageElement);
- /** @type {!goog.html.SafeUrl} */
- var safeUrl;
- if (url instanceof goog.html.SafeUrl) {
- safeUrl = url;
- } else {
- safeUrl = goog.html.SafeUrl.sanitizeAssertUnchanged(url);
- }
- imageElement.src = goog.html.SafeUrl.unwrap(safeUrl);
-};
-
-
-/**
- * Safely assigns a URL to an embed element's src property.
- *
- * Example usage:
- * goog.dom.safe.setEmbedSrc(embedEl, url);
- * which is a safe alternative to
- * embedEl.src = url;
- * The latter can result in loading untrusted code unless it is ensured that
- * the URL refers to a trustworthy resource.
- *
- * @param {!HTMLEmbedElement} embed The embed element whose src property
- * is to be assigned to.
- * @param {!goog.html.TrustedResourceUrl} url The URL to assign.
- */
-goog.dom.safe.setEmbedSrc = function(embed, url) {
- goog.dom.asserts.assertIsHTMLEmbedElement(embed);
- embed.src = goog.html.TrustedResourceUrl.unwrap(url);
-};
-
-
-/**
- * Safely assigns a URL to a frame element's src property.
- *
- * Example usage:
- * goog.dom.safe.setFrameSrc(frameEl, url);
- * which is a safe alternative to
- * frameEl.src = url;
- * The latter can result in loading untrusted code unless it is ensured that
- * the URL refers to a trustworthy resource.
- *
- * @param {!HTMLFrameElement} frame The frame element whose src property
- * is to be assigned to.
- * @param {!goog.html.TrustedResourceUrl} url The URL to assign.
- */
-goog.dom.safe.setFrameSrc = function(frame, url) {
- goog.dom.asserts.assertIsHTMLFrameElement(frame);
- frame.src = goog.html.TrustedResourceUrl.unwrap(url);
-};
-
-
-/**
- * Safely assigns a URL to an iframe element's src property.
- *
- * Example usage:
- * goog.dom.safe.setIframeSrc(iframeEl, url);
- * which is a safe alternative to
- * iframeEl.src = url;
- * The latter can result in loading untrusted code unless it is ensured that
- * the URL refers to a trustworthy resource.
- *
- * @param {!HTMLIFrameElement} iframe The iframe element whose src property
- * is to be assigned to.
- * @param {!goog.html.TrustedResourceUrl} url The URL to assign.
- */
-goog.dom.safe.setIframeSrc = function(iframe, url) {
- goog.dom.asserts.assertIsHTMLIFrameElement(iframe);
- iframe.src = goog.html.TrustedResourceUrl.unwrap(url);
-};
-
-
-/**
- * Safely assigns HTML to an iframe element's srcdoc property.
- *
- * Example usage:
- * goog.dom.safe.setIframeSrcdoc(iframeEl, safeHtml);
- * which is a safe alternative to
- * iframeEl.srcdoc = html;
- * The latter can result in loading untrusted code.
- *
- * @param {!HTMLIFrameElement} iframe The iframe element whose srcdoc property
- * is to be assigned to.
- * @param {!goog.html.SafeHtml} html The HTML to assign.
- */
-goog.dom.safe.setIframeSrcdoc = function(iframe, html) {
- goog.dom.asserts.assertIsHTMLIFrameElement(iframe);
- iframe.srcdoc = goog.html.SafeHtml.unwrap(html);
-};
-
-
-/**
- * Safely sets a link element's href and rel properties. Whether or not
- * the URL assigned to href has to be a goog.html.TrustedResourceUrl
- * depends on the value of the rel property. If rel contains "stylesheet"
- * then a TrustedResourceUrl is required.
- *
- * Example usage:
- * goog.dom.safe.setLinkHrefAndRel(linkEl, url, 'stylesheet');
- * which is a safe alternative to
- * linkEl.rel = 'stylesheet';
- * linkEl.href = url;
- * The latter can result in loading untrusted code unless it is ensured that
- * the URL refers to a trustworthy resource.
- *
- * @param {!HTMLLinkElement} link The link element whose href property
- * is to be assigned to.
- * @param {string|!goog.html.SafeUrl|!goog.html.TrustedResourceUrl} url The URL
- * to assign to the href property. Must be a TrustedResourceUrl if the
- * value assigned to rel contains "stylesheet". A string value is
- * sanitized with goog.html.SafeUrl.sanitize.
- * @param {string} rel The value to assign to the rel property.
- * @throws {Error} if rel contains "stylesheet" and url is not a
- * TrustedResourceUrl
- * @see goog.html.SafeUrl#sanitize
- */
-goog.dom.safe.setLinkHrefAndRel = function(link, url, rel) {
- goog.dom.asserts.assertIsHTMLLinkElement(link);
- link.rel = rel;
- if (goog.string.caseInsensitiveContains(rel, 'stylesheet')) {
- goog.asserts.assert(
- url instanceof goog.html.TrustedResourceUrl,
- 'URL must be TrustedResourceUrl because "rel" contains "stylesheet"');
- link.href = goog.html.TrustedResourceUrl.unwrap(url);
- } else if (url instanceof goog.html.TrustedResourceUrl) {
- link.href = goog.html.TrustedResourceUrl.unwrap(url);
- } else if (url instanceof goog.html.SafeUrl) {
- link.href = goog.html.SafeUrl.unwrap(url);
- } else { // string
- // SafeUrl.sanitize must return legitimate SafeUrl when passed a string.
- link.href =
- goog.html.SafeUrl.sanitizeAssertUnchanged(url).getTypedStringValue();
- }
-};
-
-
-/**
- * Safely assigns a URL to an object element's data property.
- *
- * Example usage:
- * goog.dom.safe.setObjectData(objectEl, url);
- * which is a safe alternative to
- * objectEl.data = url;
- * The latter can result in loading untrusted code unless setit is ensured that
- * the URL refers to a trustworthy resource.
- *
- * @param {!HTMLObjectElement} object The object element whose data property
- * is to be assigned to.
- * @param {!goog.html.TrustedResourceUrl} url The URL to assign.
- */
-goog.dom.safe.setObjectData = function(object, url) {
- goog.dom.asserts.assertIsHTMLObjectElement(object);
- object.data = goog.html.TrustedResourceUrl.unwrap(url);
-};
-
-
-/**
- * Safely assigns a URL to a script element's src property.
- *
- * Example usage:
- * goog.dom.safe.setScriptSrc(scriptEl, url);
- * which is a safe alternative to
- * scriptEl.src = url;
- * The latter can result in loading untrusted code unless it is ensured that
- * the URL refers to a trustworthy resource.
- *
- * @param {!HTMLScriptElement} script The script element whose src property
- * is to be assigned to.
- * @param {!goog.html.TrustedResourceUrl} url The URL to assign.
- */
-goog.dom.safe.setScriptSrc = function(script, url) {
- goog.dom.asserts.assertIsHTMLScriptElement(script);
- script.src = goog.html.TrustedResourceUrl.unwrap(url);
-};
-
-
-/**
- * Safely assigns a value to a script element's content.
- *
- * Example usage:
- * goog.dom.safe.setScriptContent(scriptEl, content);
- * which is a safe alternative to
- * scriptEl.text = content;
- * The latter can result in executing untrusted code unless it is ensured that
- * the code is loaded from a trustworthy resource.
- *
- * @param {!HTMLScriptElement} script The script element whose content is being
- * set.
- * @param {!goog.html.SafeScript} content The content to assign.
- */
-goog.dom.safe.setScriptContent = function(script, content) {
- goog.dom.asserts.assertIsHTMLScriptElement(script);
- script.text = goog.html.SafeScript.unwrap(content);
-};
-
-
-/**
- * Safely assigns a URL to a Location object's href property.
- *
- * If url is of type goog.html.SafeUrl, its value is unwrapped and assigned to
- * loc's href property. If url is of type string however, it is first sanitized
- * using goog.html.SafeUrl.sanitize.
- *
- * Example usage:
- * goog.dom.safe.setLocationHref(document.location, redirectUrl);
- * which is a safe alternative to
- * document.location.href = redirectUrl;
- * The latter can result in XSS vulnerabilities if redirectUrl is a
- * user-/attacker-controlled value.
- *
- * @param {!Location} loc The Location object whose href property is to be
- * assigned to.
- * @param {string|!goog.html.SafeUrl} url The URL to assign.
- * @see goog.html.SafeUrl#sanitize
- */
-goog.dom.safe.setLocationHref = function(loc, url) {
- goog.dom.asserts.assertIsLocation(loc);
- /** @type {!goog.html.SafeUrl} */
- var safeUrl;
- if (url instanceof goog.html.SafeUrl) {
- safeUrl = url;
- } else {
- safeUrl = goog.html.SafeUrl.sanitizeAssertUnchanged(url);
- }
- loc.href = goog.html.SafeUrl.unwrap(safeUrl);
-};
-
-
-/**
- * Safely opens a URL in a new window (via window.open).
- *
- * If url is of type goog.html.SafeUrl, its value is unwrapped and passed in to
- * window.open. If url is of type string however, it is first sanitized
- * using goog.html.SafeUrl.sanitize.
- *
- * Note that this function does not prevent leakages via the referer that is
- * sent by window.open. It is advised to only use this to open 1st party URLs.
- *
- * Example usage:
- * goog.dom.safe.openInWindow(url);
- * which is a safe alternative to
- * window.open(url);
- * The latter can result in XSS vulnerabilities if redirectUrl is a
- * user-/attacker-controlled value.
- *
- * @param {string|!goog.html.SafeUrl} url The URL to open.
- * @param {Window=} opt_openerWin Window of which to call the .open() method.
- * Defaults to the global window.
- * @param {!goog.string.Const=} opt_name Name of the window to open in. Can be
- * _top, etc as allowed by window.open().
- * @param {string=} opt_specs Comma-separated list of specifications, same as
- * in window.open().
- * @param {boolean=} opt_replace Whether to replace the current entry in browser
- * history, same as in window.open().
- * @return {Window} Window the url was opened in.
- */
-goog.dom.safe.openInWindow = function(
- url, opt_openerWin, opt_name, opt_specs, opt_replace) {
- /** @type {!goog.html.SafeUrl} */
- var safeUrl;
- if (url instanceof goog.html.SafeUrl) {
- safeUrl = url;
- } else {
- safeUrl = goog.html.SafeUrl.sanitizeAssertUnchanged(url);
- }
- var win = opt_openerWin || window;
- return win.open(
- goog.html.SafeUrl.unwrap(safeUrl),
- // If opt_name is undefined, simply passing that in to open() causes IE to
- // reuse the current window instead of opening a new one. Thus we pass ''
- // in instead, which according to spec opens a new window. See
- // https://html.spec.whatwg.org/multipage/browsers.html#dom-open .
- opt_name ? goog.string.Const.unwrap(opt_name) : '', opt_specs,
- opt_replace);
-};
diff --git a/static/src/assets/viz/2/goog/dom/tagname.js b/static/src/assets/viz/2/goog/dom/tagname.js
deleted file mode 100644
index b3808ad..0000000
--- a/static/src/assets/viz/2/goog/dom/tagname.js
+++ /dev/null
@@ -1,562 +0,0 @@
-// Copyright 2007 The Closure Library Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS-IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-/**
- * @fileoverview Defines the goog.dom.TagName class. Its constants enumerate
- * all HTML tag names specified in either the the W3C HTML 4.01 index of
- * elements or the HTML5 draft specification.
- *
- * References:
- * http://www.w3.org/TR/html401/index/elements.html
- * http://dev.w3.org/html5/spec/section-index.html
- */
-goog.provide('goog.dom.TagName');
-
-goog.require('goog.dom.HtmlElement');
-
-
-/**
- * A tag name with the type of the element stored in the generic.
- * @param {string} tagName
- * @constructor
- * @template T
- */
-goog.dom.TagName = function(tagName) {
- /** @private {string} */
- this.tagName_ = tagName;
-};
-
-
-/**
- * Returns the tag name.
- * @return {string}
- * @override
- */
-goog.dom.TagName.prototype.toString = function() {
- return this.tagName_;
-};
-
-
-// Closure Compiler unconditionally converts the following constants to their
-// string value (goog.dom.TagName.A -> 'A'). These are the consequences:
-// 1. Don't add any members or static members to goog.dom.TagName as they
-// couldn't be accessed after this optimization.
-// 2. Keep the constant name and its string value the same:
-// goog.dom.TagName.X = new goog.dom.TagName('Y');
-// is converted to 'X', not 'Y'.
-
-
-/** @type {!goog.dom.TagName<!HTMLAnchorElement>} */
-goog.dom.TagName.A = new goog.dom.TagName('A');
-
-
-/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */
-goog.dom.TagName.ABBR = new goog.dom.TagName('ABBR');
-
-
-/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */
-goog.dom.TagName.ACRONYM = new goog.dom.TagName('ACRONYM');
-
-
-/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */
-goog.dom.TagName.ADDRESS = new goog.dom.TagName('ADDRESS');
-
-
-/** @type {!goog.dom.TagName<!HTMLAppletElement>} */
-goog.dom.TagName.APPLET = new goog.dom.TagName('APPLET');
-
-
-/** @type {!goog.dom.TagName<!HTMLAreaElement>} */
-goog.dom.TagName.AREA = new goog.dom.TagName('AREA');
-
-
-/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */
-goog.dom.TagName.ARTICLE = new goog.dom.TagName('ARTICLE');
-
-
-/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */
-goog.dom.TagName.ASIDE = new goog.dom.TagName('ASIDE');
-
-
-/** @type {!goog.dom.TagName<!HTMLAudioElement>} */
-goog.dom.TagName.AUDIO = new goog.dom.TagName('AUDIO');
-
-
-/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */
-goog.dom.TagName.B = new goog.dom.TagName('B');
-
-
-/** @type {!goog.dom.TagName<!HTMLBaseElement>} */
-goog.dom.TagName.BASE = new goog.dom.TagName('BASE');
-
-
-/** @type {!goog.dom.TagName<!HTMLBaseFontElement>} */
-goog.dom.TagName.BASEFONT = new goog.dom.TagName('BASEFONT');
-
-
-/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */
-goog.dom.TagName.BDI = new goog.dom.TagName('BDI');
-
-
-/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */
-goog.dom.TagName.BDO = new goog.dom.TagName('BDO');
-
-
-/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */
-goog.dom.TagName.BIG = new goog.dom.TagName('BIG');
-
-
-/** @type {!goog.dom.TagName<!HTMLQuoteElement>} */
-goog.dom.TagName.BLOCKQUOTE = new goog.dom.TagName('BLOCKQUOTE');
-
-
-/** @type {!goog.dom.TagName<!HTMLBodyElement>} */
-goog.dom.TagName.BODY = new goog.dom.TagName('BODY');
-
-
-/** @type {!goog.dom.TagName<!HTMLBRElement>} */
-goog.dom.TagName.BR = new goog.dom.TagName('BR');
-
-
-/** @type {!goog.dom.TagName<!HTMLButtonElement>} */
-goog.dom.TagName.BUTTON = new goog.dom.TagName('BUTTON');
-
-
-/** @type {!goog.dom.TagName<!HTMLCanvasElement>} */
-goog.dom.TagName.CANVAS = new goog.dom.TagName('CANVAS');
-
-
-/** @type {!goog.dom.TagName<!HTMLTableCaptionElement>} */
-goog.dom.TagName.CAPTION = new goog.dom.TagName('CAPTION');
-
-
-/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */
-goog.dom.TagName.CENTER = new goog.dom.TagName('CENTER');
-
-
-/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */
-goog.dom.TagName.CITE = new goog.dom.TagName('CITE');
-
-
-/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */
-goog.dom.TagName.CODE = new goog.dom.TagName('CODE');
-
-
-/** @type {!goog.dom.TagName<!HTMLTableColElement>} */
-goog.dom.TagName.COL = new goog.dom.TagName('COL');
-
-
-/** @type {!goog.dom.TagName<!HTMLTableColElement>} */
-goog.dom.TagName.COLGROUP = new goog.dom.TagName('COLGROUP');
-
-
-/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */
-goog.dom.TagName.COMMAND = new goog.dom.TagName('COMMAND');
-
-
-/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */
-goog.dom.TagName.DATA = new goog.dom.TagName('DATA');
-
-
-/** @type {!goog.dom.TagName<!HTMLDataListElement>} */
-goog.dom.TagName.DATALIST = new goog.dom.TagName('DATALIST');
-
-
-/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */
-goog.dom.TagName.DD = new goog.dom.TagName('DD');
-
-
-/** @type {!goog.dom.TagName<!HTMLModElement>} */
-goog.dom.TagName.DEL = new goog.dom.TagName('DEL');
-
-
-/** @type {!goog.dom.TagName<!HTMLDetailsElement>} */
-goog.dom.TagName.DETAILS = new goog.dom.TagName('DETAILS');
-
-
-/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */
-goog.dom.TagName.DFN = new goog.dom.TagName('DFN');
-
-
-/** @type {!goog.dom.TagName<!HTMLDialogElement>} */
-goog.dom.TagName.DIALOG = new goog.dom.TagName('DIALOG');
-
-
-/** @type {!goog.dom.TagName<!HTMLDirectoryElement>} */
-goog.dom.TagName.DIR = new goog.dom.TagName('DIR');
-
-
-/** @type {!goog.dom.TagName<!HTMLDivElement>} */
-goog.dom.TagName.DIV = new goog.dom.TagName('DIV');
-
-
-/** @type {!goog.dom.TagName<!HTMLDListElement>} */
-goog.dom.TagName.DL = new goog.dom.TagName('DL');
-
-
-/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */
-goog.dom.TagName.DT = new goog.dom.TagName('DT');
-
-
-/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */
-goog.dom.TagName.EM = new goog.dom.TagName('EM');
-
-
-/** @type {!goog.dom.TagName<!HTMLEmbedElement>} */
-goog.dom.TagName.EMBED = new goog.dom.TagName('EMBED');
-
-
-/** @type {!goog.dom.TagName<!HTMLFieldSetElement>} */
-goog.dom.TagName.FIELDSET = new goog.dom.TagName('FIELDSET');
-
-
-/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */
-goog.dom.TagName.FIGCAPTION = new goog.dom.TagName('FIGCAPTION');
-
-
-/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */
-goog.dom.TagName.FIGURE = new goog.dom.TagName('FIGURE');
-
-
-/** @type {!goog.dom.TagName<!HTMLFontElement>} */
-goog.dom.TagName.FONT = new goog.dom.TagName('FONT');
-
-
-/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */
-goog.dom.TagName.FOOTER = new goog.dom.TagName('FOOTER');
-
-
-/** @type {!goog.dom.TagName<!HTMLFormElement>} */
-goog.dom.TagName.FORM = new goog.dom.TagName('FORM');
-
-
-/** @type {!goog.dom.TagName<!HTMLFrameElement>} */
-goog.dom.TagName.FRAME = new goog.dom.TagName('FRAME');
-
-
-/** @type {!goog.dom.TagName<!HTMLFrameSetElement>} */
-goog.dom.TagName.FRAMESET = new goog.dom.TagName('FRAMESET');
-
-
-/** @type {!goog.dom.TagName<!HTMLHeadingElement>} */
-goog.dom.TagName.H1 = new goog.dom.TagName('H1');
-
-
-/** @type {!goog.dom.TagName<!HTMLHeadingElement>} */
-goog.dom.TagName.H2 = new goog.dom.TagName('H2');
-
-
-/** @type {!goog.dom.TagName<!HTMLHeadingElement>} */
-goog.dom.TagName.H3 = new goog.dom.TagName('H3');
-
-
-/** @type {!goog.dom.TagName<!HTMLHeadingElement>} */
-goog.dom.TagName.H4 = new goog.dom.TagName('H4');
-
-
-/** @type {!goog.dom.TagName<!HTMLHeadingElement>} */
-goog.dom.TagName.H5 = new goog.dom.TagName('H5');
-
-
-/** @type {!goog.dom.TagName<!HTMLHeadingElement>} */
-goog.dom.TagName.H6 = new goog.dom.TagName('H6');
-
-
-/** @type {!goog.dom.TagName<!HTMLHeadElement>} */
-goog.dom.TagName.HEAD = new goog.dom.TagName('HEAD');
-
-
-/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */
-goog.dom.TagName.HEADER = new goog.dom.TagName('HEADER');
-
-
-/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */
-goog.dom.TagName.HGROUP = new goog.dom.TagName('HGROUP');
-
-
-/** @type {!goog.dom.TagName<!HTMLHRElement>} */
-goog.dom.TagName.HR = new goog.dom.TagName('HR');
-
-
-/** @type {!goog.dom.TagName<!HTMLHtmlElement>} */
-goog.dom.TagName.HTML = new goog.dom.TagName('HTML');
-
-
-/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */
-goog.dom.TagName.I = new goog.dom.TagName('I');
-
-
-/** @type {!goog.dom.TagName<!HTMLIFrameElement>} */
-goog.dom.TagName.IFRAME = new goog.dom.TagName('IFRAME');
-
-
-/** @type {!goog.dom.TagName<!HTMLImageElement>} */
-goog.dom.TagName.IMG = new goog.dom.TagName('IMG');
-
-
-/** @type {!goog.dom.TagName<!HTMLInputElement>} */
-goog.dom.TagName.INPUT = new goog.dom.TagName('INPUT');
-
-
-/** @type {!goog.dom.TagName<!HTMLModElement>} */
-goog.dom.TagName.INS = new goog.dom.TagName('INS');
-
-
-/** @type {!goog.dom.TagName<!HTMLIsIndexElement>} */
-goog.dom.TagName.ISINDEX = new goog.dom.TagName('ISINDEX');
-
-
-/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */
-goog.dom.TagName.KBD = new goog.dom.TagName('KBD');
-
-
-// HTMLKeygenElement is deprecated.
-/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */
-goog.dom.TagName.KEYGEN = new goog.dom.TagName('KEYGEN');
-
-
-/** @type {!goog.dom.TagName<!HTMLLabelElement>} */
-goog.dom.TagName.LABEL = new goog.dom.TagName('LABEL');
-
-
-/** @type {!goog.dom.TagName<!HTMLLegendElement>} */
-goog.dom.TagName.LEGEND = new goog.dom.TagName('LEGEND');
-
-
-/** @type {!goog.dom.TagName<!HTMLLIElement>} */
-goog.dom.TagName.LI = new goog.dom.TagName('LI');
-
-
-/** @type {!goog.dom.TagName<!HTMLLinkElement>} */
-goog.dom.TagName.LINK = new goog.dom.TagName('LINK');
-
-
-/** @type {!goog.dom.TagName<!HTMLMapElement>} */
-goog.dom.TagName.MAP = new goog.dom.TagName('MAP');
-
-
-/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */
-goog.dom.TagName.MARK = new goog.dom.TagName('MARK');
-
-
-/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */
-goog.dom.TagName.MATH = new goog.dom.TagName('MATH');
-
-
-/** @type {!goog.dom.TagName<!HTMLMenuElement>} */
-goog.dom.TagName.MENU = new goog.dom.TagName('MENU');
-
-
-/** @type {!goog.dom.TagName<!HTMLMetaElement>} */
-goog.dom.TagName.META = new goog.dom.TagName('META');
-
-
-/** @type {!goog.dom.TagName<!HTMLMeterElement>} */
-goog.dom.TagName.METER = new goog.dom.TagName('METER');
-
-
-/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */
-goog.dom.TagName.NAV = new goog.dom.TagName('NAV');
-
-
-/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */
-goog.dom.TagName.NOFRAMES = new goog.dom.TagName('NOFRAMES');
-
-
-/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */
-goog.dom.TagName.NOSCRIPT = new goog.dom.TagName('NOSCRIPT');
-
-
-/** @type {!goog.dom.TagName<!HTMLObjectElement>} */
-goog.dom.TagName.OBJECT = new goog.dom.TagName('OBJECT');
-
-
-/** @type {!goog.dom.TagName<!HTMLOListElement>} */
-goog.dom.TagName.OL = new goog.dom.TagName('OL');
-
-
-/** @type {!goog.dom.TagName<!HTMLOptGroupElement>} */
-goog.dom.TagName.OPTGROUP = new goog.dom.TagName('OPTGROUP');
-
-
-/** @type {!goog.dom.TagName<!HTMLOptionElement>} */
-goog.dom.TagName.OPTION = new goog.dom.TagName('OPTION');
-
-
-/** @type {!goog.dom.TagName<!HTMLOutputElement>} */
-goog.dom.TagName.OUTPUT = new goog.dom.TagName('OUTPUT');
-
-
-/** @type {!goog.dom.TagName<!HTMLParagraphElement>} */
-goog.dom.TagName.P = new goog.dom.TagName('P');
-
-
-/** @type {!goog.dom.TagName<!HTMLParamElement>} */
-goog.dom.TagName.PARAM = new goog.dom.TagName('PARAM');
-
-
-/** @type {!goog.dom.TagName<!HTMLPreElement>} */
-goog.dom.TagName.PRE = new goog.dom.TagName('PRE');
-
-
-/** @type {!goog.dom.TagName<!HTMLProgressElement>} */
-goog.dom.TagName.PROGRESS = new goog.dom.TagName('PROGRESS');
-
-
-/** @type {!goog.dom.TagName<!HTMLQuoteElement>} */
-goog.dom.TagName.Q = new goog.dom.TagName('Q');
-
-
-/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */
-goog.dom.TagName.RP = new goog.dom.TagName('RP');
-
-
-/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */
-goog.dom.TagName.RT = new goog.dom.TagName('RT');
-
-
-/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */
-goog.dom.TagName.RUBY = new goog.dom.TagName('RUBY');
-
-
-/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */
-goog.dom.TagName.S = new goog.dom.TagName('S');
-
-
-/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */
-goog.dom.TagName.SAMP = new goog.dom.TagName('SAMP');
-
-
-/** @type {!goog.dom.TagName<!HTMLScriptElement>} */
-goog.dom.TagName.SCRIPT = new goog.dom.TagName('SCRIPT');
-
-
-/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */
-goog.dom.TagName.SECTION = new goog.dom.TagName('SECTION');
-
-
-/** @type {!goog.dom.TagName<!HTMLSelectElement>} */
-goog.dom.TagName.SELECT = new goog.dom.TagName('SELECT');
-
-
-/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */
-goog.dom.TagName.SMALL = new goog.dom.TagName('SMALL');
-
-
-/** @type {!goog.dom.TagName<!HTMLSourceElement>} */
-goog.dom.TagName.SOURCE = new goog.dom.TagName('SOURCE');
-
-
-/** @type {!goog.dom.TagName<!HTMLSpanElement>} */
-goog.dom.TagName.SPAN = new goog.dom.TagName('SPAN');
-
-
-/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */
-goog.dom.TagName.STRIKE = new goog.dom.TagName('STRIKE');
-
-
-/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */
-goog.dom.TagName.STRONG = new goog.dom.TagName('STRONG');
-
-
-/** @type {!goog.dom.TagName<!HTMLStyleElement>} */
-goog.dom.TagName.STYLE = new goog.dom.TagName('STYLE');
-
-
-/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */
-goog.dom.TagName.SUB = new goog.dom.TagName('SUB');
-
-
-/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */
-goog.dom.TagName.SUMMARY = new goog.dom.TagName('SUMMARY');
-
-
-/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */
-goog.dom.TagName.SUP = new goog.dom.TagName('SUP');
-
-
-/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */
-goog.dom.TagName.SVG = new goog.dom.TagName('SVG');
-
-
-/** @type {!goog.dom.TagName<!HTMLTableElement>} */
-goog.dom.TagName.TABLE = new goog.dom.TagName('TABLE');
-
-
-/** @type {!goog.dom.TagName<!HTMLTableSectionElement>} */
-goog.dom.TagName.TBODY = new goog.dom.TagName('TBODY');
-
-
-/** @type {!goog.dom.TagName<!HTMLTableCellElement>} */
-goog.dom.TagName.TD = new goog.dom.TagName('TD');
-
-
-/** @type {!goog.dom.TagName<!HTMLTemplateElement>} */
-goog.dom.TagName.TEMPLATE = new goog.dom.TagName('TEMPLATE');
-
-
-/** @type {!goog.dom.TagName<!HTMLTextAreaElement>} */
-goog.dom.TagName.TEXTAREA = new goog.dom.TagName('TEXTAREA');
-
-
-/** @type {!goog.dom.TagName<!HTMLTableSectionElement>} */
-goog.dom.TagName.TFOOT = new goog.dom.TagName('TFOOT');
-
-
-/** @type {!goog.dom.TagName<!HTMLTableCellElement>} */
-goog.dom.TagName.TH = new goog.dom.TagName('TH');
-
-
-/** @type {!goog.dom.TagName<!HTMLTableSectionElement>} */
-goog.dom.TagName.THEAD = new goog.dom.TagName('THEAD');
-
-
-/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */
-goog.dom.TagName.TIME = new goog.dom.TagName('TIME');
-
-
-/** @type {!goog.dom.TagName<!HTMLTitleElement>} */
-goog.dom.TagName.TITLE = new goog.dom.TagName('TITLE');
-
-
-/** @type {!goog.dom.TagName<!HTMLTableRowElement>} */
-goog.dom.TagName.TR = new goog.dom.TagName('TR');
-
-
-/** @type {!goog.dom.TagName<!HTMLTrackElement>} */
-goog.dom.TagName.TRACK = new goog.dom.TagName('TRACK');
-
-
-/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */
-goog.dom.TagName.TT = new goog.dom.TagName('TT');
-
-
-/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */
-goog.dom.TagName.U = new goog.dom.TagName('U');
-
-
-/** @type {!goog.dom.TagName<!HTMLUListElement>} */
-goog.dom.TagName.UL = new goog.dom.TagName('UL');
-
-
-/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */
-goog.dom.TagName.VAR = new goog.dom.TagName('VAR');
-
-
-/** @type {!goog.dom.TagName<!HTMLVideoElement>} */
-goog.dom.TagName.VIDEO = new goog.dom.TagName('VIDEO');
-
-
-/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */
-goog.dom.TagName.WBR = new goog.dom.TagName('WBR');
diff --git a/static/src/assets/viz/2/goog/dom/tags.js b/static/src/assets/viz/2/goog/dom/tags.js
deleted file mode 100644
index 7c12938..0000000
--- a/static/src/assets/viz/2/goog/dom/tags.js
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright 2014 The Closure Library Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS-IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-/**
- * @fileoverview Utilities for HTML element tag names.
- */
-goog.provide('goog.dom.tags');
-
-goog.require('goog.object');
-
-
-/**
- * The void elements specified by
- * http://www.w3.org/TR/html-markup/syntax.html#void-elements.
- * @const @private {!Object<string, boolean>}
- */
-goog.dom.tags.VOID_TAGS_ = goog.object.createSet(
- 'area', 'base', 'br', 'col', 'command', 'embed', 'hr', 'img', 'input',
- 'keygen', 'link', 'meta', 'param', 'source', 'track', 'wbr');
-
-
-/**
- * Checks whether the tag is void (with no contents allowed and no legal end
- * tag), for example 'br'.
- * @param {string} tagName The tag name in lower case.
- * @return {boolean}
- */
-goog.dom.tags.isVoidTag = function(tagName) {
- return goog.dom.tags.VOID_TAGS_[tagName] === true;
-};