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

Unified Diff: tools/dom/templates/html/impl/impl_Element.darttemplate

Issue 1349493003: Dartium JS Interop enabled. (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Created 5 years, 3 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: tools/dom/templates/html/impl/impl_Element.darttemplate
diff --git a/tools/dom/templates/html/impl/impl_Element.darttemplate b/tools/dom/templates/html/impl/impl_Element.darttemplate
index 6f5ae1b2cb8c68f4074eba8b89d93f64ab0d8b46..1c1426892d45bb247b55ace84badbb0ad9daa071 100644
--- a/tools/dom/templates/html/impl/impl_Element.darttemplate
+++ b/tools/dom/templates/html/impl/impl_Element.darttemplate
@@ -33,7 +33,7 @@ class _ChildrenElementList extends ListBase<Element>
_element._replaceChild(value, _childElements[index]);
}
- void set length(int newLength) {
+ set length(int newLength) {
// TODO(jacobr): remove children when length is reduced.
throw new UnsupportedError('Cannot resize element lists');
}
@@ -97,7 +97,12 @@ class _ChildrenElementList extends ListBase<Element>
bool remove(Object object) {
if (object is Element) {
Element element = object;
+$if JSINTEROP
+ // We aren't preserving identity of nodes in JSINTEROP mode
+ if (element.parentNode == _element) {
+$else
if (identical(element.parentNode, _element)) {
+$endif
_element._removeChild(element);
return true;
}
@@ -281,7 +286,7 @@ $endif
throw new UnsupportedError('Cannot modify list');
}
- void set length(int newLength) {
+ set length(int newLength) {
throw new UnsupportedError('Cannot modify list');
}
@@ -304,7 +309,7 @@ $endif
CssStyleDeclarationBase get style =>
new _CssStyleDeclarationSet(this);
- void set classes(Iterable<String> value) {
+ set classes(Iterable<String> value) {
// TODO(sra): This might be faster for Sets:
//
// new _MultiElementCssClassSet(this).writeClasses(value)
@@ -328,7 +333,7 @@ $!ELEMENT_STREAM_GETTERS
}
@DocsEditable()
-$(ANNOTATIONS)$(NATIVESPEC)abstract class $CLASSNAME$EXTENDS$IMPLEMENTS {
+$(ANNOTATIONS)$(NATIVESPEC)class $CLASSNAME$EXTENDS$IMPLEMENTS {
/**
* Creates an HTML element from a valid fragment of HTML.
@@ -375,11 +380,7 @@ $(ANNOTATIONS)$(NATIVESPEC)abstract class $CLASSNAME$EXTENDS$IMPLEMENTS {
* }
* document.registerElement('x-custom', CustomElement);
*/
- Element.created() : super._created() {
- // Validate that this is a custom element & perform any additional
- // initialization.
- _initializeCustomElement(this);
- }
+ Element.created() : super._created();
/**
* Creates the HTML element specified by the tag name.
@@ -560,7 +561,7 @@ $(ANNOTATIONS)$(NATIVESPEC)abstract class $CLASSNAME$EXTENDS$IMPLEMENTS {
*/
Map<String, String> get attributes => new _ElementAttributeMap(this);
- void set attributes(Map<String, String> value) {
+ set attributes(Map<String, String> value) {
Map<String, String> attributes = this.attributes;
attributes.clear();
for (String key in value.keys) {
@@ -580,17 +581,9 @@ $(ANNOTATIONS)$(NATIVESPEC)abstract class $CLASSNAME$EXTENDS$IMPLEMENTS {
* element.style.background = 'red'; // Turns every child of body red.
* }
*/
-$if DART2JS
List<Element> get children => new _ChildrenElementList._wrap(this);
-$else
- $if JSINTEROP
- List<Element> get children => new FilteredElementList(this);
- $else
- List<Element> get children => new _ChildrenElementList._wrap(this);
- $endif
-$endif
- void set children(List<Element> value) {
+ set children(List<Element> value) {
// Copy list first since we don't want liveness during iteration.
List copy = new List.from(value);
var children = this.children;
@@ -611,11 +604,7 @@ $endif
*/
@DomName('Element.querySelectorAll')
ElementList<Element> querySelectorAll(String selectors) =>
-$if JSINTEROP
- _querySelectorAll(selectors);
-$else
new _FrozenElementList._wrap(_querySelectorAll(selectors));
-$endif
/**
* Alias for [querySelector]. Note this function is deprecated because its
@@ -648,7 +637,7 @@ $endif
*/
CssClassSet get classes => new _ElementCssClassSet(this);
- void set classes(Iterable<String> value) {
+ set classes(Iterable<String> value) {
// TODO(sra): Do this without reading the classes in clear() and addAll(),
// or writing the classes in clear().
CssClassSet classSet = classes;
@@ -682,7 +671,7 @@ $endif
Map<String, String> get dataset =>
new _DataAttributeMap(attributes);
- void set dataset(Map<String, String> value) {
+ set dataset(Map<String, String> value) {
final data = this.dataset;
data.clear();
for (String key in value.keys) {
@@ -801,7 +790,6 @@ $endif
@deprecated
void leftView() {}
-$if DART2JS
/**
* Creates a new AnimationEffect object whose target element is the object
* on which the method is called, and calls the play() method of the
@@ -816,18 +804,15 @@ $if DART2JS
* var animation = elem.animate([
* {"transform": "translate(100px, -100%)"},
* {"transform" : "translate(400px, 500px)"}
- * ], 1500);
+ * ], 1500);
*
* The [frames] parameter is an Iterable<Map>, where the
* map entries specify CSS animation effects. The
* [timing] paramter can be a double, representing the number of milliseconds
* for the transition, or a Map with fields corresponding to those
* of the [Timing] object.
- *
- * This is not yet supported in Dartium.
**/
-// TODO(alanknight): Correct above comment once it works in Dartium.
- @Experimental
+ @Experimental()
@SupportedBrowser(SupportedBrowser.CHROME, '36')
AnimationPlayer animate(Iterable<Map<String, dynamic>> frames, [timing]) {
if (frames is! Iterable || !(frames.every((x) => x is Map))) {
@@ -836,7 +821,8 @@ $if DART2JS
}
var convertedFrames = frames;
if (convertedFrames is Iterable) {
- convertedFrames = frames.map(convertDartToNative_Dictionary).toList();
+ convertedFrames = convertDartToNative_List(
+ frames.map(convertDartToNative_Dictionary).toList());
}
var convertedTiming = timing;
if (convertedTiming is Map) {
@@ -847,6 +833,7 @@ $if DART2JS
: _animate(convertedFrames, convertedTiming);
}
+$if DART2JS
@DomName('Element.animate')
@JSName('animate')
@Experimental() // untriaged
@@ -880,7 +867,7 @@ $endif
// members of the component are used. The actual type is a subtype of Element.
get xtag => _xtag != null ? _xtag : this;
- void set xtag(Element value) {
+ set xtag(Element value) {
_xtag = value;
}
@@ -1006,7 +993,7 @@ $if DART2JS
@JSName('insertAdjacentText')
void _insertAdjacentText(String where, String text) native;
-
+
$else
$endif
@@ -1269,8 +1256,13 @@ $endif
// offsetParent, "tops out" at BODY. But people could conceivably pass in
// the document.documentElement and I want it to return an absolute offset,
// so we have the special case checking for HTML.
- bool foundAsParent = identical(current, parent) || parent.tagName == 'HTML';
- if (current == null || identical(current, parent)) {
+$if JSINTEROP
+ bool sameAsParent = current == parent;
+$else
+ bool sameAsParent = identical(current, parent);
+$endif
+ bool foundAsParent = sameAsParent || parent.tagName == 'HTML';
+ if (current == null || sameAsParent) {
if (foundAsParent) return new Point(0, 0);
throw new ArgumentError("Specified element is not a transitive offset "
"parent of this element.");
@@ -1328,11 +1320,11 @@ $endif
if (_parseDocument == null) {
_parseDocument = document.implementation.createHtmlDocument('');
_parseRange = _parseDocument.createRange();
-
+
// Workaround for Safari bug. Was also previously Chrome bug 229142
- // - URIs are not resolved in new doc.
- var base = _parseDocument.createElement('base');
- base.href = document.baseUri;
+ // - URIs are not resolved in new doc.
+ var base = _parseDocument.createElement('base');
+ base.href = document.baseUri;
_parseDocument.head.append(base);
}
var contextElement;
@@ -1390,7 +1382,7 @@ $endif
* This uses the default sanitization behavior to sanitize the HTML fragment,
* use [setInnerHtml] to override the default behavior.
*/
- void set innerHtml(String html) {
+ set innerHtml(String html) {
this.setInnerHtml(html);
}
@@ -1432,7 +1424,7 @@ $endif
* used when an explicit accessor is not available.
*/
ElementEvents get on => new ElementEvents(this);
-
+
/**
* Verify if any of the attributes that we use in the sanitizer look unexpected,
* possibly indicating DOM clobbering attacks.
@@ -1461,10 +1453,44 @@ $if DART2JS
})(#)''', element);
}
$else
- // Dartium isn't affected by these attacks, because it goes directly to the C++ API.
- static bool _hasCorruptedAttributes(Element element) => false;
+
+ static var _namedNodeMap = js.context["NamedNodeMap"];
+ static var _htmlCollection = js.context["HTMLCollection"];
+ static var _nodeList = js.context["NodeList"];
+
+ static bool _hasCorruptedAttributes(Element element) {
+ var attributes = unwrap_jso(element)["attributes"];
+ if (!attributes.instanceof(_namedNodeMap)) {
+ return true;
+ }
+ var childNodes = unwrap_jso(element.childNodes);
+ var length = childNodes["length"];
+ var lastChild = unwrap_jso(element.lastChild);
+ if (null != lastChild &&
+ lastChild != childNodes[length - 1]) {
+ return true;
+ }
+ var children = unwrap_jso(element._children);
+ if (null != children) { // On Safari, children can apparently be null.
+ if (!children.instanceof(_htmlCollection) ||
+ children.instanceof(_nodeList)) {
+ return true;
+ }
+ }
+ return false;
+ }
$endif
+ String get _safeTagName {
+ String result = 'element tag unavailable';
+ try {
+ if (tagName is String) {
+ result = tagName;
+ }
+ } catch (e) {}
+ return result;
+ }
+
$if DART2JS
@DomName('Element.offsetHeight')
@DocsEditable()
@@ -1508,7 +1534,7 @@ $if DART2JS
@DomName('Element.scrollLeft')
@DocsEditable()
- void set scrollLeft(int value) {
+ set scrollLeft(int value) {
JS("void", "#.scrollLeft = #", this, value.round());
}
@@ -1518,7 +1544,7 @@ $if DART2JS
@DomName('Element.scrollTop')
@DocsEditable()
- void set scrollTop(int value) {
+ set scrollTop(int value) {
JS("void", "#.scrollTop = #", this, value.round());
}
@@ -1528,6 +1554,10 @@ $if DART2JS
$else
$if JSINTEROP
+ // Need to explicitly delegate because Element is no longer abstract for Dartium.
+ bool get isContentEditable => _blink.BlinkHTMLElement.instance.isContentEditable_Getter_(unwrap_jso(this));
+ void click() => _blink.BlinkHTMLElement.instance.click_Callback_0_(unwrap_jso(this));
+
@DomName('Element.offsetHeight')
@DocsEditable()
int get offsetHeight => _blink.BlinkElement.instance.offsetHeight_Getter_(unwrap_jso(this)).round();
@@ -1570,7 +1600,7 @@ $else
@DomName('Element.scrollLeft')
@DocsEditable()
- void set scrollLeft(int value) => _blink.BlinkElement.instance.scrollLeft_Setter_(unwrap_jso(this), value.round());
+ set scrollLeft(int value) => _blink.BlinkElement.instance.scrollLeft_Setter_(unwrap_jso(this), value.round());
@DomName('Element.scrollTop')
@DocsEditable()
@@ -1578,7 +1608,7 @@ $else
@DomName('Element.scrollTop')
@DocsEditable()
- void set scrollTop(int value) => _blink.BlinkElement.instance.scrollTop_Setter_(unwrap_jso(this), value.round());
+ set scrollTop(int value) => _blink.BlinkElement.instance.scrollTop_Setter_(unwrap_jso(this), value.round());
@DomName('Element.scrollWidth')
@DocsEditable()
@@ -1626,7 +1656,7 @@ $else
@DomName('Element.scrollLeft')
@DocsEditable()
- void set scrollLeft(int value) => _blink.BlinkElement.scrollLeft_Setter(this, value.round());
+ set scrollLeft(int value) => _blink.BlinkElement.scrollLeft_Setter(this, value.round());
@DomName('Element.scrollTop')
@DocsEditable()
@@ -1634,7 +1664,7 @@ $else
@DomName('Element.scrollTop')
@DocsEditable()
- void set scrollTop(int value) => _blink.BlinkElement.scrollTop_Setter(this, value.round());
+ set scrollTop(int value) => _blink.BlinkElement.scrollTop_Setter(this, value.round());
@DomName('Element.scrollWidth')
@DocsEditable()

Powered by Google App Engine
This is Rietveld 408576698