Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(65)

Unified Diff: pkg/web_components/lib/created_watcher.js

Issue 319263002: Add "created-watcher" to the web_components package. This was adapted from (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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..8f32e7e9ce6e7548b9cef041df8400d4effa3728
--- /dev/null
+++ b/pkg/web_components/lib/created_watcher.js
@@ -0,0 +1,70 @@
+// 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) {
+ var originalRegisterElement = doc.registerElement;
Siggi Cherem (dart-lang) 2014/06/06 22:31:47 this changed from document to doc
+ if (!originalRegisterElement) {
+ throw new Error('document.registerElement is not present.');
+ }
+
+ function registerElement(name, options) {
+ 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
+ for (var attr in options) {
+ if (options.hasOwnProperty(attr)) {
+ newOptions[attr] = options[attr];
+ }
+ }
+
+ var originalCreated = newOptions.prototype.createdCallback;
+ newOptions.prototype.createdCallback = function() {
+ originalCreated.call(this);
+
+ var key = getTagKey(this.tagName, this.getAttribute('is'));
+ var watchers = createdWatchers[key];
+ if (!watchers) {
+ return;
+ }
+ for (var i = 0, w; (w = watchers[i]); i++) {
+ invokeWatcher(this, w);
+ }
+ };
+
+ return originalRegisterElement.call(doc, name, newOptions);
+ }
+
+ function invokeWatcher(node, watcher) {
+ if (watcher.createdCallback) {
+ watcher.createdCallback.call(node);
+ }
+ }
+
+ // Unique key for the tagName & extends combo
+ function getTagKey(tagName, isTag) {
+ if (isTag) {
+ // '.' 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.
+ return tagName.toUpperCase() + '.' + isTag.toUpperCase();
+ }
+ return tagName.toUpperCase();
+ }
+
+ 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
+
+
+ function registerElementCreatedWatcher(name, options) {
+ if (!options) return;
+
+ var tagName = options.extends || name;
+ 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.
+ if (key in createdWatchers) {
+ createdWatchers[key].push(options);
+ } else {
+ createdWatchers[key] = [options];
+ }
+ }
+
+ doc.registerElementCreatedWatcher = registerElementCreatedWatcher;
+ doc.registerElement = registerElement;
+})(document);

Powered by Google App Engine
This is Rietveld 408576698