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) { | |
8 var originalRegisterElement = doc.registerElement; | |
Siggi Cherem (dart-lang)
2014/06/06 22:31:47
this changed from document to doc
| |
9 if (!originalRegisterElement) { | |
10 throw new Error('document.registerElement is not present.'); | |
11 } | |
12 | |
13 function registerElement(name, options) { | |
14 var newOptions = Object.create(options); | |
justinfagnani
2014/06/06 23:33:05
Why setup a prototype and copy ownProperties? I wo
Siggi Cherem (dart-lang)
2014/06/09 17:10:27
very good questions. I had many discussions here w
| |
15 for (var attr in options) { | |
16 if (options.hasOwnProperty(attr)) { | |
17 newOptions[attr] = options[attr]; | |
18 } | |
19 } | |
20 | |
21 var originalCreated = newOptions.prototype.createdCallback; | |
22 newOptions.prototype.createdCallback = function() { | |
23 originalCreated.call(this); | |
24 | |
25 var key = getTagKey(this.tagName, this.getAttribute('is')); | |
26 var watchers = createdWatchers[key]; | |
27 if (!watchers) { | |
28 return; | |
29 } | |
30 for (var i = 0, w; (w = watchers[i]); i++) { | |
31 invokeWatcher(this, w); | |
32 } | |
33 }; | |
34 | |
35 return originalRegisterElement.call(doc, name, newOptions); | |
36 } | |
37 | |
38 function invokeWatcher(node, watcher) { | |
39 if (watcher.createdCallback) { | |
40 watcher.createdCallback.call(node); | |
41 } | |
42 } | |
43 | |
44 // Unique key for the tagName & extends combo | |
45 function getTagKey(tagName, isTag) { | |
46 if (isTag) { | |
47 // '.' is a reserved character for XML names, so safe to use. | |
justinfagnani
2014/06/06 23:33:05
I think this will be simpler if you just use isTag
Siggi Cherem (dart-lang)
2014/06/09 17:10:28
Good idea. Done.
| |
48 return tagName.toUpperCase() + '.' + isTag.toUpperCase(); | |
49 } | |
50 return tagName.toUpperCase(); | |
51 } | |
52 | |
53 var createdWatchers = {}; | |
justinfagnani
2014/06/06 23:33:05
what's our style here, var declarations in the mid
Siggi Cherem (dart-lang)
2014/06/09 17:10:27
I moved it up because it is used above, but I hone
| |
54 | |
55 | |
56 function registerElementCreatedWatcher(name, options) { | |
57 if (!options) return; | |
58 | |
59 var tagName = options.extends || name; | |
60 var key = getTagKey(tagName, options.extends ? name : undefined); | |
Siggi Cherem (dart-lang)
2014/06/06 22:31:47
this changed from:
getTagKey(name, options.exten
justinfagnani
2014/06/06 23:33:05
Same as the comment above, except just always use
Siggi Cherem (dart-lang)
2014/06/09 17:10:27
Done.
| |
61 if (key in createdWatchers) { | |
62 createdWatchers[key].push(options); | |
63 } else { | |
64 createdWatchers[key] = [options]; | |
65 } | |
66 } | |
67 | |
68 doc.registerElementCreatedWatcher = registerElementCreatedWatcher; | |
69 doc.registerElement = registerElement; | |
70 })(document); | |
OLD | NEW |