Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | |
| 2 // for details. All rights reserved. Use of this source code is governed by a | |
| 3 // BSD-style license that can be found in the LICENSE file. | |
| 4 | |
| 5 // Updates document.registerElement so Dart can see when Javascript custom | |
| 6 // elements are created, and wrap them to provide a Dart friendly API. | |
| 7 (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!
| |
| 8 var registeredWatchers = {}; | |
| 9 var originalRegisterElement = doc.registerElement; | |
| 10 if (!originalRegisterElement) { | |
| 11 throw new Error('document.registerElement is not present.'); | |
| 12 } | |
| 13 | |
| 14 function registerElement(name, options) { | |
| 15 var proto, extendsOption; | |
| 16 if (options !== undefined) { | |
| 17 proto = options.prototype; | |
| 18 } else { | |
| 19 proto = Object.create(HTMLElement.prototype); | |
| 20 options = {protoptype: proto}; | |
| 21 } | |
| 22 | |
| 23 var original = proto.createdCallback; | |
| 24 var newCallback = function() { | |
| 25 original.call(this); | |
| 26 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.
| |
| 27 var watchers = registeredWatchers[name.toUpperCase()]; | |
| 28 if (!watchers) return; | |
| 29 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.
| |
| 30 watchers[i](this); | |
| 31 } | |
| 32 }; | |
| 33 | |
| 34 var descriptor = Object.getOwnPropertyDescriptor(proto, 'createdCallback'); | |
| 35 if (!descriptor || descriptor.writable) { | |
| 36 proto.createdCallback = newCallback; | |
| 37 } else if (descriptor.configurable) { | |
| 38 descriptor['value'] = newCallback; | |
| 39 Object.defineProperty(proto, 'createdCallback', descriptor); | |
| 40 } else { | |
| 41 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.
| |
| 42 " elements are created. This can be fixed by making the " + | |
| 43 "createdCallback in " + name + " a configurable property."); | |
| 44 } | |
| 45 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.
| |
| 46 } | |
| 47 | |
| 48 function registerElementCreatedWatcher(name, watcherId, watcher) { | |
| 49 if (!watcher) return; | |
| 50 name = name.toUpperCase(); | |
| 51 var watchers = registeredWatchers[name]; | |
| 52 if (!watchers) { | |
| 53 registeredWatchers[name] = watchers = []; | |
| 54 } | |
| 55 watchers[watcherId] = watcher; | |
| 56 } | |
| 57 | |
| 58 function unregisterElementCreatedWatcher(name, watcherId) { | |
| 59 name = name.toUpperCase(); | |
| 60 var watchers = registeredWatchers[name]; | |
| 61 if (watchers) { | |
| 62 delete watchers[watcherId]; | |
| 63 } | |
| 64 } | |
| 65 | |
| 66 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.
| |
| 67 doc.unregisterElementCreatedWatcher = unregisterElementCreatedWatcher; | |
| 68 doc.registerElement = registerElement; | |
| 69 })(document); | |
| OLD | NEW |