/* * Copyright (c) 2014 The Polymer Project Authors. All rights reserved. * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt * Code distributed by Google as part of the polymer project is also * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt */ (function(scope) { // dom polyfill, additions, and utility methods var registry = {}; HTMLElement.register = function(tag, prototype) { registry[tag] = prototype; }; // get prototype mapped to node HTMLElement.getPrototypeForTag = function(tag) { var prototype = !tag ? HTMLElement.prototype : registry[tag]; // TODO(sjmiles): creating is likely to have wasteful side-effects return prototype || Object.getPrototypeOf(document.createElement(tag)); }; // we have to flag propagation stoppage for the event dispatcher var originalStopPropagation = Event.prototype.stopPropagation; Event.prototype.stopPropagation = function() { this.cancelBubble = true; originalStopPropagation.apply(this, arguments); }; // polyfill DOMTokenList // * add/remove: allow these methods to take multiple classNames // * toggle: add a 2nd argument which forces the given state rather // than toggling. var add = DOMTokenList.prototype.add; var remove = DOMTokenList.prototype.remove; DOMTokenList.prototype.add = function() { for (var i = 0; i < arguments.length; i++) { add.call(this, arguments[i]); } }; DOMTokenList.prototype.remove = function() { for (var i = 0; i < arguments.length; i++) { remove.call(this, arguments[i]); } }; DOMTokenList.prototype.toggle = function(name, bool) { if (arguments.length == 1) { bool = !this.contains(name); } bool ? this.add(name) : this.remove(name); }; DOMTokenList.prototype.switch = function(oldName, newName) { oldName && this.remove(oldName); newName && this.add(newName); }; // add array() to NodeList, NamedNodeMap, HTMLCollection var ArraySlice = function() { return Array.prototype.slice.call(this); }; var namedNodeMap = (window.NamedNodeMap || window.MozNamedAttrMap || {}); NodeList.prototype.array = ArraySlice; namedNodeMap.prototype.array = ArraySlice; HTMLCollection.prototype.array = ArraySlice; // utility function createDOM(inTagOrNode, inHTML, inAttrs) { var dom = typeof inTagOrNode == 'string' ? document.createElement(inTagOrNode) : inTagOrNode.cloneNode(true); dom.innerHTML = inHTML; if (inAttrs) { for (var n in inAttrs) { dom.setAttribute(n, inAttrs[n]); } } return dom; } // exports scope.createDOM = createDOM; })(Polymer);