| Index: pkg/web_components/lib/dart_support.js
|
| diff --git a/pkg/web_components/lib/dart_support.js b/pkg/web_components/lib/dart_support.js
|
| index 81e7d9b24bdafa67728dfaa27a52e586e822c420..efa130106068a64608998a29152adb148a7f5d8e 100644
|
| --- a/pkg/web_components/lib/dart_support.js
|
| +++ b/pkg/web_components/lib/dart_support.js
|
| @@ -70,6 +70,9 @@
|
| (function (doc) {
|
| var upgraders = {}; // upgrader associated with a custom-tag.
|
| var unpatchableTags = {}; // set of custom-tags that can't be patched.
|
| + var pendingElements = {}; // will upgrade when/if an upgrader is installed.
|
| + var upgradeOldElements = true;
|
| +
|
| var originalRegisterElement = doc.registerElement;
|
| if (!originalRegisterElement) {
|
| throw new Error('document.registerElement is not present.');
|
| @@ -93,9 +96,19 @@
|
| var original = proto.createdCallback;
|
| var newCallback = function() {
|
| original.call(this);
|
| - var name = this.getAttribute('is') || this.localName;
|
| - var upgrader = upgraders[name.toLowerCase()];
|
| - if (upgrader) upgrader(this);
|
| + var name = (this.getAttribute('is') || this.localName).toLowerCase();
|
| + var upgrader = upgraders[name];
|
| + if (upgrader) {
|
| + upgrader(this);
|
| + } else if (upgradeOldElements) {
|
| + // Save this element in case we can upgrade it later when an upgrader is
|
| + // registered.
|
| + var list = pendingElements[name];
|
| + if (!list) {
|
| + list = pendingElements[name] = [];
|
| + }
|
| + list.push(this);
|
| + }
|
| };
|
|
|
| var descriptor = Object.getOwnPropertyDescriptor(proto, 'createdCallback');
|
| @@ -121,8 +134,25 @@
|
| }
|
| upgraders[name] = upgrader;
|
| if (unpatchableTags[name]) reportError(name);
|
| + if (upgradeOldElements) {
|
| + // Upgrade elements that were created before the upgrader was registered.
|
| + var list = pendingElements[name];
|
| + if (list) {
|
| + for (var i = 0; i < list.length; i++) {
|
| + upgrader(list[i]);
|
| + }
|
| + }
|
| + delete pendingElements[name];
|
| + } else {
|
| + console.warn("Didn't expect more Dart types to be registered. '" + name
|
| + + "' elements that already exist in the page might not be wrapped.");
|
| + }
|
| }
|
|
|
| + function onlyUpgradeNewElements() {
|
| + upgradeOldElements = false;
|
| + pendingElements = null;
|
| + }
|
|
|
| // Native custom elements outside the app in Chrome have constructor
|
| // names like "x-tag", which need to be translated to the DOM
|
| @@ -151,5 +181,6 @@
|
| }
|
|
|
| doc._registerDartTypeUpgrader = registerDartTypeUpgrader;
|
| + doc._onlyUpgradeNewElements = onlyUpgradeNewElements;
|
| doc.registerElement = registerElement;
|
| })(document);
|
|
|