Chromium Code Reviews| Index: pkg/web_components/lib/created_watcher.js |
| diff --git a/pkg/web_components/lib/created_watcher.js b/pkg/web_components/lib/created_watcher.js |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..ff9db337ba3dfc5e4b5e888e3a065149376c7f4c |
| --- /dev/null |
| +++ b/pkg/web_components/lib/created_watcher.js |
| @@ -0,0 +1,69 @@ |
| +// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
| +// for details. All rights reserved. Use of this source code is governed by a |
| +// BSD-style license that can be found in the LICENSE file. |
| + |
| +// Updates document.registerElement so Dart can see when Javascript custom |
| +// elements are created, and wrap them to provide a Dart friendly API. |
| +(function (doc) { |
|
Jennifer Messerly
2014/06/09 17:36:07
can we include this in dart_support.js? all polyme
Siggi Cherem (dart-lang)
2014/06/09 19:29:02
I debated about it earlier :) - will do when we a
Jennifer Messerly
2014/06/09 19:33:52
sounds good!
|
| + var registeredWatchers = {}; |
| + var originalRegisterElement = doc.registerElement; |
| + if (!originalRegisterElement) { |
| + throw new Error('document.registerElement is not present.'); |
| + } |
| + |
| + function registerElement(name, options) { |
| + var proto, extendsOption; |
| + if (options !== undefined) { |
| + proto = options.prototype; |
| + } else { |
| + proto = Object.create(HTMLElement.prototype); |
| + options = {protoptype: proto}; |
| + } |
| + |
| + var original = proto.createdCallback; |
| + var newCallback = function() { |
| + original.call(this); |
| + var name = this.getAttribute('is') || this.tagName; |
|
Jennifer Messerly
2014/06/09 17:36:07
fyi: CE polyfill uses localName and toLowerCase in
Siggi Cherem (dart-lang)
2014/06/09 19:29:02
Done.
|
| + var watchers = registeredWatchers[name.toUpperCase()]; |
| + if (!watchers) return; |
| + for (var i in watchers) { |
|
Jennifer Messerly
2014/06/09 17:36:07
based on my other suggestion, it will be possible
Siggi Cherem (dart-lang)
2014/06/09 19:29:02
Done.
|
| + watchers[i](this); |
| + } |
| + }; |
| + |
| + var descriptor = Object.getOwnPropertyDescriptor(proto, 'createdCallback'); |
| + if (!descriptor || descriptor.writable) { |
| + proto.createdCallback = newCallback; |
| + } else if (descriptor.configurable) { |
| + descriptor['value'] = newCallback; |
| + Object.defineProperty(proto, 'createdCallback', descriptor); |
| + } else { |
| + console.warn("Couldn't patch prototype to notify Dart when " + name + |
|
Jennifer Messerly
2014/06/09 17:36:07
console.error?
Siggi Cherem (dart-lang)
2014/06/09 19:29:02
Done.
|
| + " elements are created. This can be fixed by making the " + |
| + "createdCallback in " + name + " a configurable property."); |
| + } |
| + return originalRegisterElement.call(doc, name, options); |
|
Jennifer Messerly
2014/06/09 17:36:07
this, name, options?
Siggi Cherem (dart-lang)
2014/06/09 19:29:02
Done.
|
| + } |
| + |
| + function registerElementCreatedWatcher(name, watcherId, watcher) { |
| + if (!watcher) return; |
| + name = name.toUpperCase(); |
| + var watchers = registeredWatchers[name]; |
| + if (!watchers) { |
| + registeredWatchers[name] = watchers = []; |
| + } |
| + watchers[watcherId] = watcher; |
| + } |
| + |
| + function unregisterElementCreatedWatcher(name, watcherId) { |
| + name = name.toUpperCase(); |
| + var watchers = registeredWatchers[name]; |
| + if (watchers) { |
| + delete watchers[watcherId]; |
| + } |
| + } |
| + |
| + doc.registerElementCreatedWatcher = registerElementCreatedWatcher; |
|
Jennifer Messerly
2014/06/09 17:36:07
it might be worth keeping these private, and only
Siggi Cherem (dart-lang)
2014/06/09 19:29:02
Done.
|
| + doc.unregisterElementCreatedWatcher = unregisterElementCreatedWatcher; |
| + doc.registerElement = registerElement; |
| +})(document); |