| Index: pkg/element_created/lib/element_created.js | 
| diff --git a/pkg/element_created/lib/element_created.js b/pkg/element_created/lib/element_created.js | 
| new file mode 100644 | 
| index 0000000000000000000000000000000000000000..243794501d9946bdf2fb2d4a541e1cd74f2bb89d | 
| --- /dev/null | 
| +++ b/pkg/element_created/lib/element_created.js | 
| @@ -0,0 +1,67 @@ | 
| +(function (doc) { | 
| + | 
| +  var originalRegisterElement = document.registerElement; | 
| +  if (!originalRegisterElement) { | 
| +    throw new Error('document.registerElement is not present.'); | 
| +  } | 
| + | 
| +  function registerElement(name, options) { | 
| +    var newOptions = Object.create(options); | 
| +    for (var attr in options) { | 
| +      if (options.hasOwnProperty(attr)) { | 
| +        newOptions[attr] = options[attr]; | 
| +      } | 
| +    } | 
| + | 
| +    var originalCreated = newOptions.prototype.createdCallback; | 
| + | 
| +    newOptions.prototype.createdCallback = function() { | 
| +      originalCreated.call(this); | 
| + | 
| +      var key = getTagKey(this.tagName, this.getAttribute('is')); | 
| +      var watchers = createdWatchers[key]; | 
| +      if (!watchers) { | 
| +        return; | 
| +      } | 
| +      for (var i = 0, w; (w = watchers[i]); i++) { | 
| +        invokeWatcher(this, w); | 
| +      } | 
| +    }; | 
| + | 
| +    return originalRegisterElement.call(doc, name, newOptions); | 
| +  } | 
| + | 
| +  function invokeWatcher(node, watcher) { | 
| +    if (watcher.createdCallback) { | 
| +      watcher.createdCallback.call(node); | 
| +    } | 
| +  } | 
| + | 
| +  // Unique key for the tagName & extends combo | 
| +  function getTagKey(tagName, isTag) { | 
| +    if (isTag) { | 
| +      // '.' is a reserved character for XML names, so safe to use. | 
| +      return tagName.toUpperCase() + '.' + isTag.toUpperCase(); | 
| +    } | 
| +    return tagName.toUpperCase(); | 
| +  } | 
| + | 
| +  var createdWatchers = {}; | 
| + | 
| + | 
| +  function registerElementCreatedWatcher(name, options) { | 
| +    if (!options) return; | 
| + | 
| +    var key = getTagKey(name, options.extends); | 
| +    if (key in createdWatchers) { | 
| +      createdWatchers[key].push(options); | 
| +    } else { | 
| +      createdWatchers[key] = [options]; | 
| +    } | 
| +  } | 
| + | 
| + | 
| + | 
| +  doc.registerElementCreatedWatcher = registerElementCreatedWatcher; | 
| +  doc.registerElement = registerElement; | 
| +})(document); | 
|  |