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 |