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

Unified Diff: sdk/lib/html/dart2js/html_dart2js.dart

Side-by-side diff isn't available for this file because of its large size.
Issue 184033007: Prototype of Dart proxies for JS objects. Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: More tests. Created 6 years, 9 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:
Download patch
« no previous file with comments | « pkg/element_created/test/unittest.js ('k') | sdk/lib/html/dartium/html_dartium.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: sdk/lib/html/dart2js/html_dart2js.dart
diff --git a/sdk/lib/html/dart2js/html_dart2js.dart b/sdk/lib/html/dart2js/html_dart2js.dart
index 15967d9542aafdadef752de74c18407fda2f3671..447de5206aef562cd60dc19092ca3d709f63d5bd 100644
--- a/sdk/lib/html/dart2js/html_dart2js.dart
+++ b/sdk/lib/html/dart2js/html_dart2js.dart
@@ -12383,18 +12383,18 @@ class ElementEvents extends Events {
/* Raw event target. */
final Element _ptr;
static final webkitEvents = {
- 'animationend' : 'webkitAnimationEnd',
- 'animationiteration' : 'webkitAnimationIteration',
- 'animationstart' : 'webkitAnimationStart',
- 'fullscreenchange' : 'webkitfullscreenchange',
+ 'animationend' : 'webkitAnimationEnd',
+ 'animationiteration' : 'webkitAnimationIteration',
+ 'animationstart' : 'webkitAnimationStart',
+ 'fullscreenchange' : 'webkitfullscreenchange',
'fullscreenerror' : 'webkitfullscreenerror',
- 'keyadded' : 'webkitkeyadded',
- 'keyerror' : 'webkitkeyerror',
- 'keymessage' : 'webkitkeymessage',
- 'needkey' : 'webkitneedkey',
- 'pointerlockchange' : 'webkitpointerlockchange',
- 'pointerlockerror' : 'webkitpointerlockerror',
- 'resourcetimingbufferfull' : 'webkitresourcetimingbufferfull',
+ 'keyadded' : 'webkitkeyadded',
+ 'keyerror' : 'webkitkeyerror',
+ 'keymessage' : 'webkitkeymessage',
+ 'needkey' : 'webkitneedkey',
+ 'pointerlockchange' : 'webkitpointerlockchange',
+ 'pointerlockerror' : 'webkitpointerlockerror',
+ 'resourcetimingbufferfull' : 'webkitresourcetimingbufferfull',
'transitionend': 'webkitTransitionEnd',
'speechchange' : 'webkitSpeechChange'
};
@@ -14422,32 +14422,6 @@ class HtmlDocument extends Document native "HTMLDocument" {
* This custom element can also be instantiated via HTML using the syntax
* `<input is="x-bar"></input>`
*
- * The [nativeTagName] parameter is needed by platforms without native support
- * when subclassing a native type other than:
- *
- * * HtmlElement
- * * SvgElement
- * * AnchorElement
- * * AudioElement
- * * ButtonElement
- * * CanvasElement
- * * DivElement
- * * ImageElement
- * * InputElement
- * * LIElement
- * * LabelElement
- * * MenuElement
- * * MeterElement
- * * OListElement
- * * OptionElement
- * * OutputElement
- * * ParagraphElement
- * * PreElement
- * * ProgressElement
- * * SelectElement
- * * SpanElement
- * * UListElement
- * * VideoElement
*/
void register(String tag, Type customElementClass, {String extendsTag}) {
_registerCustomElement(JS('', 'window'), this, tag, customElementClass,
@@ -14489,7 +14463,21 @@ class HtmlDocument extends Document native "HTMLDocument" {
@Experimental()
Stream<Event> get onVisibilityChange =>
visibilityChangeEvent.forTarget(this);
+
+ ElementUpgrader createElementUpgrader(Type type, [String tagName]) {
+ return new _JSElementUpgrader(this, type, tagName);
+ }
+
+}
+
+
+
+abstract class ElementUpgrader {
+ // Validate that e is subclass of type's native type
+ // validate that e has not been upgraded as any type
+ Element upgrade(Element element);
}
+
// Copyright (c) 2012, 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.
@@ -35359,6 +35347,58 @@ void _registerCustomElement(context, document, String tag, Type type,
void _initializeCustomElement(Element e) {
// TODO(blois): Add validation that this is only in response to an upgrade.
}
+
+class _JSElementUpgrader implements ElementUpgrader {
+ var _interceptor;
+ var _baseClassName;
+ var _constructor;
+
+ _JSElementUpgrader(Document document, Type type, String tagName) {
+ var interceptorClass = findInterceptorConstructorForType(type);
+ if (interceptorClass == null) {
+ throw new ArgumentError(type);
+ }
+
+ _constructor = findConstructorForNativeSubclassType(type, 'created');
+ if (_constructor == null) {
+ throw new ArgumentError("$type has no constructor called 'created'");
+ }
+
+ // Workaround for 13190- use an article element to ensure that HTMLElement's
+ // interceptor is resolved correctly.
+ getNativeInterceptor(new Element.tag('article'));
+
+ _baseClassName = findDispatchTagForInterceptorClass(interceptorClass);
+ if (_baseClassName == null) {
+ throw new ArgumentError(type);
+ }
+
+ if (tagName == null) {
+ if (_baseClassName != 'HTMLElement') {
+ throw new UnsupportedError('Class must provide extendsTag if base '
+ 'native class is not HTMLElement');
+ }
+ } else {
+ if (!JS('bool', '(#.createElement(#) instanceof window[#])',
+ document, tagName, _baseClassName)) {
+ throw new UnsupportedError(
+ 'extendsTag does not match base native class');
+ }
+ }
+
+ _interceptor = JS('=Object', '#.prototype', interceptorClass);
+ }
+
+ Element upgrade(Element element) {
+ if (!JS('bool', '(# instanceof window[#])', element, _baseClassName)) {
+ throw new ArgumentError('element is not subclass of $_baseClassName');
+ }
+
+ setNativeSubclassDispatchRecord(element, _interceptor);
+ JS('', '#(#)', _constructor, element);
+ return element;
+ }
+}
// Copyright (c) 2012, 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.
« no previous file with comments | « pkg/element_created/test/unittest.js ('k') | sdk/lib/html/dartium/html_dartium.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698