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 1c1426892d45bb247b55ace84badbb0ad9daa071..6f5ae1b2cb8c68f4074eba8b89d93f64ab0d8b46 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]); |
} |
- set length(int newLength) { |
+ void set length(int newLength) { |
// TODO(jacobr): remove children when length is reduced. |
throw new UnsupportedError('Cannot resize element lists'); |
} |
@@ -97,12 +97,7 @@ 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; |
} |
@@ -286,7 +281,7 @@ $endif |
throw new UnsupportedError('Cannot modify list'); |
} |
- set length(int newLength) { |
+ void set length(int newLength) { |
throw new UnsupportedError('Cannot modify list'); |
} |
@@ -309,7 +304,7 @@ $endif |
CssStyleDeclarationBase get style => |
new _CssStyleDeclarationSet(this); |
- set classes(Iterable<String> value) { |
+ void set classes(Iterable<String> value) { |
// TODO(sra): This might be faster for Sets: |
// |
// new _MultiElementCssClassSet(this).writeClasses(value) |
@@ -333,7 +328,7 @@ $!ELEMENT_STREAM_GETTERS |
} |
@DocsEditable() |
-$(ANNOTATIONS)$(NATIVESPEC)class $CLASSNAME$EXTENDS$IMPLEMENTS { |
+$(ANNOTATIONS)$(NATIVESPEC)abstract class $CLASSNAME$EXTENDS$IMPLEMENTS { |
/** |
* Creates an HTML element from a valid fragment of HTML. |
@@ -380,7 +375,11 @@ $(ANNOTATIONS)$(NATIVESPEC)class $CLASSNAME$EXTENDS$IMPLEMENTS { |
* } |
* document.registerElement('x-custom', CustomElement); |
*/ |
- Element.created() : super._created(); |
+ Element.created() : super._created() { |
+ // Validate that this is a custom element & perform any additional |
+ // initialization. |
+ _initializeCustomElement(this); |
+ } |
/** |
* Creates the HTML element specified by the tag name. |
@@ -561,7 +560,7 @@ $(ANNOTATIONS)$(NATIVESPEC)class $CLASSNAME$EXTENDS$IMPLEMENTS { |
*/ |
Map<String, String> get attributes => new _ElementAttributeMap(this); |
- set attributes(Map<String, String> value) { |
+ void set attributes(Map<String, String> value) { |
Map<String, String> attributes = this.attributes; |
attributes.clear(); |
for (String key in value.keys) { |
@@ -581,9 +580,17 @@ $(ANNOTATIONS)$(NATIVESPEC)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 |
- set children(List<Element> value) { |
+ void 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; |
@@ -604,7 +611,11 @@ $(ANNOTATIONS)$(NATIVESPEC)class $CLASSNAME$EXTENDS$IMPLEMENTS { |
*/ |
@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 |
@@ -637,7 +648,7 @@ $(ANNOTATIONS)$(NATIVESPEC)class $CLASSNAME$EXTENDS$IMPLEMENTS { |
*/ |
CssClassSet get classes => new _ElementCssClassSet(this); |
- set classes(Iterable<String> value) { |
+ void 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; |
@@ -671,7 +682,7 @@ $(ANNOTATIONS)$(NATIVESPEC)class $CLASSNAME$EXTENDS$IMPLEMENTS { |
Map<String, String> get dataset => |
new _DataAttributeMap(attributes); |
- set dataset(Map<String, String> value) { |
+ void set dataset(Map<String, String> value) { |
final data = this.dataset; |
data.clear(); |
for (String key in value.keys) { |
@@ -790,6 +801,7 @@ $(ANNOTATIONS)$(NATIVESPEC)class $CLASSNAME$EXTENDS$IMPLEMENTS { |
@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 |
@@ -804,15 +816,18 @@ $(ANNOTATIONS)$(NATIVESPEC)class $CLASSNAME$EXTENDS$IMPLEMENTS { |
* 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. |
**/ |
- @Experimental() |
+// TODO(alanknight): Correct above comment once it works in Dartium. |
+ @Experimental |
@SupportedBrowser(SupportedBrowser.CHROME, '36') |
AnimationPlayer animate(Iterable<Map<String, dynamic>> frames, [timing]) { |
if (frames is! Iterable || !(frames.every((x) => x is Map))) { |
@@ -821,8 +836,7 @@ $(ANNOTATIONS)$(NATIVESPEC)class $CLASSNAME$EXTENDS$IMPLEMENTS { |
} |
var convertedFrames = frames; |
if (convertedFrames is Iterable) { |
- convertedFrames = convertDartToNative_List( |
- frames.map(convertDartToNative_Dictionary).toList()); |
+ convertedFrames = frames.map(convertDartToNative_Dictionary).toList(); |
} |
var convertedTiming = timing; |
if (convertedTiming is Map) { |
@@ -833,7 +847,6 @@ $(ANNOTATIONS)$(NATIVESPEC)class $CLASSNAME$EXTENDS$IMPLEMENTS { |
: _animate(convertedFrames, convertedTiming); |
} |
-$if DART2JS |
@DomName('Element.animate') |
@JSName('animate') |
@Experimental() // untriaged |
@@ -867,7 +880,7 @@ $endif |
// members of the component are used. The actual type is a subtype of Element. |
get xtag => _xtag != null ? _xtag : this; |
- set xtag(Element value) { |
+ void set xtag(Element value) { |
_xtag = value; |
} |
@@ -993,7 +1006,7 @@ $if DART2JS |
@JSName('insertAdjacentText') |
void _insertAdjacentText(String where, String text) native; |
- |
+ |
$else |
$endif |
@@ -1256,13 +1269,8 @@ $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. |
-$if JSINTEROP |
- bool sameAsParent = current == parent; |
-$else |
- bool sameAsParent = identical(current, parent); |
-$endif |
- bool foundAsParent = sameAsParent || parent.tagName == 'HTML'; |
- if (current == null || sameAsParent) { |
+ bool foundAsParent = identical(current, parent) || parent.tagName == 'HTML'; |
+ if (current == null || identical(current, parent)) { |
if (foundAsParent) return new Point(0, 0); |
throw new ArgumentError("Specified element is not a transitive offset " |
"parent of this element."); |
@@ -1320,11 +1328,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; |
@@ -1382,7 +1390,7 @@ $endif |
* This uses the default sanitization behavior to sanitize the HTML fragment, |
* use [setInnerHtml] to override the default behavior. |
*/ |
- set innerHtml(String html) { |
+ void set innerHtml(String html) { |
this.setInnerHtml(html); |
} |
@@ -1424,7 +1432,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. |
@@ -1453,44 +1461,10 @@ $if DART2JS |
})(#)''', element); |
} |
$else |
- |
- 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; |
- } |
+ // Dartium isn't affected by these attacks, because it goes directly to the C++ API. |
+ static bool _hasCorruptedAttributes(Element element) => 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() |
@@ -1534,7 +1508,7 @@ $if DART2JS |
@DomName('Element.scrollLeft') |
@DocsEditable() |
- set scrollLeft(int value) { |
+ void set scrollLeft(int value) { |
JS("void", "#.scrollLeft = #", this, value.round()); |
} |
@@ -1544,7 +1518,7 @@ $if DART2JS |
@DomName('Element.scrollTop') |
@DocsEditable() |
- set scrollTop(int value) { |
+ void set scrollTop(int value) { |
JS("void", "#.scrollTop = #", this, value.round()); |
} |
@@ -1554,10 +1528,6 @@ $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(); |
@@ -1600,7 +1570,7 @@ $else |
@DomName('Element.scrollLeft') |
@DocsEditable() |
- set scrollLeft(int value) => _blink.BlinkElement.instance.scrollLeft_Setter_(unwrap_jso(this), value.round()); |
+ void set scrollLeft(int value) => _blink.BlinkElement.instance.scrollLeft_Setter_(unwrap_jso(this), value.round()); |
@DomName('Element.scrollTop') |
@DocsEditable() |
@@ -1608,7 +1578,7 @@ $else |
@DomName('Element.scrollTop') |
@DocsEditable() |
- set scrollTop(int value) => _blink.BlinkElement.instance.scrollTop_Setter_(unwrap_jso(this), value.round()); |
+ void set scrollTop(int value) => _blink.BlinkElement.instance.scrollTop_Setter_(unwrap_jso(this), value.round()); |
@DomName('Element.scrollWidth') |
@DocsEditable() |
@@ -1656,7 +1626,7 @@ $else |
@DomName('Element.scrollLeft') |
@DocsEditable() |
- set scrollLeft(int value) => _blink.BlinkElement.scrollLeft_Setter(this, value.round()); |
+ void set scrollLeft(int value) => _blink.BlinkElement.scrollLeft_Setter(this, value.round()); |
@DomName('Element.scrollTop') |
@DocsEditable() |
@@ -1664,7 +1634,7 @@ $else |
@DomName('Element.scrollTop') |
@DocsEditable() |
- set scrollTop(int value) => _blink.BlinkElement.scrollTop_Setter(this, value.round()); |
+ void set scrollTop(int value) => _blink.BlinkElement.scrollTop_Setter(this, value.round()); |
@DomName('Element.scrollWidth') |
@DocsEditable() |