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

Side by Side Diff: runtime/bin/vmservice/observatory/deployed/web/packages/web_components/interop_support.js

Issue 839543002: Revert "Build Observatory with runtime" (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 5 years, 11 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
(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 if (window._dart_register_element_interop_support) return;
9 window._dart_register_element_interop_support = true;
10
11 var upgraders = {}; // upgrader associated with a custom-tag.
12 var unpatchableTags = {}; // set of custom-tags that can't be patched.
13 var pendingElements = {}; // will upgrade when/if an upgrader is installed.
14 var upgradeOldElements = true;
15
16 var originalRegisterElement = doc.registerElement;
17 if (!originalRegisterElement) {
18 throw new Error('document.registerElement is not present.');
19 }
20
21 function reportError(name) {
22 console.error("Couldn't patch prototype to notify Dart when " + name +
23 " elements are created. This can be fixed by making the " +
24 "createdCallback in " + name + " a configurable property.");
25 }
26
27 function registerElement(name, options) {
28 var proto, extendsOption;
29 if (options !== undefined) {
30 proto = options.prototype;
31 } else {
32 proto = Object.create(HTMLElement.prototype);
33 options = {protoptype: proto};
34 }
35
36 var original = proto.createdCallback;
37 var newCallback = function() {
38 original.call(this);
39 var name = (this.getAttribute('is') || this.localName).toLowerCase();
40 var upgrader = upgraders[name];
41 if (upgrader) {
42 upgrader(this);
43 } else if (upgradeOldElements) {
44 // Save this element in case we can upgrade it later when an upgrader is
45 // registered.
46 var list = pendingElements[name];
47 if (!list) {
48 list = pendingElements[name] = [];
49 }
50 list.push(this);
51 }
52 };
53
54 var descriptor = Object.getOwnPropertyDescriptor(proto, 'createdCallback');
55 if (!descriptor || descriptor.writable) {
56 proto.createdCallback = newCallback;
57 } else if (descriptor.configurable) {
58 descriptor['value'] = newCallback;
59 Object.defineProperty(proto, 'createdCallback', descriptor);
60 } else {
61 unpatchableTags[name] = true;
62 if (upgraders[name]) reportError(name);
63 }
64 return originalRegisterElement.call(this, name, options);
65 }
66
67 function registerDartTypeUpgrader(name, upgrader) {
68 if (!upgrader) return;
69 name = name.toLowerCase();
70 var existing = upgraders[name];
71 if (existing) {
72 console.error('Already have a Dart type associated with ' + name);
73 return;
74 }
75 upgraders[name] = upgrader;
76 if (unpatchableTags[name]) reportError(name);
77 if (upgradeOldElements) {
78 // Upgrade elements that were created before the upgrader was registered.
79 var list = pendingElements[name];
80 if (list) {
81 for (var i = 0; i < list.length; i++) {
82 upgrader(list[i]);
83 }
84 }
85 delete pendingElements[name];
86 } else {
87 console.warn("Didn't expect more Dart types to be registered. '" + name
88 + "' elements that already exist in the page might not be wrapped.");
89 }
90 }
91
92 function onlyUpgradeNewElements() {
93 upgradeOldElements = false;
94 pendingElements = null;
95 }
96
97 // Native custom elements outside the app in Chrome have constructor
98 // names like "x-tag", which need to be translated to the DOM
99 // element they extend. When using the shadow dom polyfill this is
100 // taken care of in dart_support.js.
101 var ShadowDOMPolyfill = window.ShadowDOMPolyfill;
102 if (!ShadowDOMPolyfill) {
103 // dartNativeDispatchHooksTransformer is described on initHooks() in
104 // sdk/lib/_internal/lib/native_helper.dart.
105 if (typeof window.dartNativeDispatchHooksTransformer == 'undefined')
106 window.dartNativeDispatchHooksTransformer = [];
107
108 window.dartNativeDispatchHooksTransformer.push(function(hooks) {
109 var originalGetUnknownTag = hooks.getUnknownTag;
110 hooks.getUnknownTag = function(o, tag) {
111 if (/-/.test(tag)) { // "x-tag"
112 var s = Object.prototype.toString.call(o);
113 var match = s.match(/^\[object ([A-Za-z]*Element)\]$/);
114 if (match) {
115 return match[1];
116 }
117 return originalGetUnknownTag(o, tag);
118 }
119 };
120 });
121 }
122
123 doc._registerDartTypeUpgrader = registerDartTypeUpgrader;
124 doc._onlyUpgradeNewElements = onlyUpgradeNewElements;
125 doc.registerElement = registerElement;
126 })(document);
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698