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

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

Issue 1832713002: Optimize dartium dart:html bindings so real world application performance is acceptable. Improves d… (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: update cached patches Created 4 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:
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 4b8173bf316152f50f073b3ac7e11fc43c32569f..399e90d93a89309d71cf8b6d51953efe036b1717 100644
--- a/tools/dom/templates/html/impl/impl_Element.darttemplate
+++ b/tools/dom/templates/html/impl/impl_Element.darttemplate
@@ -380,7 +380,15 @@ $(ANNOTATIONS)$(NATIVESPEC)class $CLASSNAME$EXTENDS$IMPLEMENTS {
* }
* document.registerElement('x-custom', CustomElement);
*/
+$if DART2JS
Element.created() : super._created();
+$else
+ Element.created() : super._created() {
+ // Validate that this is a custom element & possibly perform additional
+ // initialization.
+ _blink.Blink_Utils.initializeCustomElement(this);
+ }
+$endif
/**
* Creates the HTML element specified by the tag name.
@@ -1483,24 +1491,20 @@ $else
static var _htmlCollection = js.context["HTMLCollection"];
static var _nodeList = js.context["NodeList"];
+ static const _evilAttributeNames =
+ const ['attributes', 'lastChild', 'children', 'childNodes'];
+
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;
- }
+ // We have trusted access to children and to attributes of objects,
+ // so we can inspect directly for attempts at DOM clobbering.
+ var child = element.firstChild;
+ while( child != null) {
+ if (child is Element) {
+ for (var attributeName in ["id", "name"]) {
+ var childAttribute = child.getAttribute(attributeName);
+ if (_evilAttributeNames.contains(childAttribute)) return true;
+ }}
+ child = child.nextNode;
}
return false;
}
@@ -1509,6 +1513,7 @@ $else
static bool _hasCorruptedAttributesAdditionalCheck(Element element) => false;
$endif
+$if DART2JS
static String _safeTagName(element) {
String result = 'element tag unavailable';
try {
@@ -1518,6 +1523,15 @@ $endif
} catch (e) {}
return result;
}
+$else
+ static String _safeTagName(element) {
+ try {
+ // Safe as we plumb directly to a C++ native method.
+ return element.tagName;
+ } catch (e) {}
+ return 'element tag unavailable';
+ }
+$endif
$if DART2JS
@DomName('Element.offsetParent')
@@ -1570,52 +1584,52 @@ $if DART2JS
$else
// 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));
+ bool get isContentEditable => _blink.BlinkHTMLElement.instance.isContentEditable_Getter_(this);
+ void click() => _blink.BlinkHTMLElement.instance.click_Callback_0_(this);
@DomName('Element.offsetParent')
@DocsEditable()
- Element get offsetParent => wrap_jso(_blink.BlinkElement.instance.offsetParent_Getter_(unwrap_jso(this)));
+ Element get offsetParent => _blink.BlinkElement.instance.offsetParent_Getter_(this);
@DomName('Element.offsetHeight')
@DocsEditable()
- int get offsetHeight => _blink.BlinkElement.instance.offsetHeight_Getter_(unwrap_jso(this));
+ int get offsetHeight => _blink.BlinkElement.instance.offsetHeight_Getter_(this);
@DomName('Element.offsetLeft')
@DocsEditable()
- int get offsetLeft => _blink.BlinkElement.instance.offsetLeft_Getter_(unwrap_jso(this));
+ int get offsetLeft => _blink.BlinkElement.instance.offsetLeft_Getter_(this);
@DomName('Element.offsetTop')
@DocsEditable()
- int get offsetTop => _blink.BlinkElement.instance.offsetTop_Getter_(unwrap_jso(this));
+ int get offsetTop => _blink.BlinkElement.instance.offsetTop_Getter_(this);
@DomName('Element.offsetWidth')
@DocsEditable()
- int get offsetWidth => _blink.BlinkElement.instance.offsetWidth_Getter_(unwrap_jso(this));
+ int get offsetWidth => _blink.BlinkElement.instance.offsetWidth_Getter_(this);
@DomName('Element.scrollHeight')
@DocsEditable()
- int get scrollHeight => _blink.BlinkElement.instance.scrollHeight_Getter_(unwrap_jso(this)).round();
+ int get scrollHeight => _blink.BlinkElement.instance.scrollHeight_Getter_(this).round();
@DomName('Element.scrollLeft')
@DocsEditable()
- int get scrollLeft => _blink.BlinkElement.instance.scrollLeft_Getter_(unwrap_jso(this)).round();
+ int get scrollLeft => _blink.BlinkElement.instance.scrollLeft_Getter_(this).round();
@DomName('Element.scrollLeft')
@DocsEditable()
- set scrollLeft(int value) => _blink.BlinkElement.instance.scrollLeft_Setter_(unwrap_jso(this), value.round());
+ set scrollLeft(int value) => _blink.BlinkElement.instance.scrollLeft_Setter_(this, value.round());
@DomName('Element.scrollTop')
@DocsEditable()
- int get scrollTop => _blink.BlinkElement.instance.scrollTop_Getter_(unwrap_jso(this)).round();
+ int get scrollTop => _blink.BlinkElement.instance.scrollTop_Getter_(this).round();
@DomName('Element.scrollTop')
@DocsEditable()
- set scrollTop(int value) => _blink.BlinkElement.instance.scrollTop_Setter_(unwrap_jso(this), value.round());
+ set scrollTop(int value) => _blink.BlinkElement.instance.scrollTop_Setter_(this, value.round());
@DomName('Element.scrollWidth')
@DocsEditable()
- int get scrollWidth => _blink.BlinkElement.instance.scrollWidth_Getter_(unwrap_jso(this)).round();
+ int get scrollWidth => _blink.BlinkElement.instance.scrollWidth_Getter_(this).round();
$endif
$!MEMBERS

Powered by Google App Engine
This is Rietveld 408576698