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

Unified Diff: client/html/src/ElementWrappingImplementation.dart

Issue 9145004: Revert "Example showing alternate async measurement solution" (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 8 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « client/html/src/Element.dart ('k') | client/html/src/EventTargetWrappingImplementation.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: client/html/src/ElementWrappingImplementation.dart
diff --git a/client/html/src/ElementWrappingImplementation.dart b/client/html/src/ElementWrappingImplementation.dart
index 5220caaa8dc97e9e282ddfeb85c385bf3267c48e..8f9abb72c0912f01c9f612180b4ec7d5751087e5 100644
--- a/client/html/src/ElementWrappingImplementation.dart
+++ b/client/html/src/ElementWrappingImplementation.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
+// Copyright (c) 2011, 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.
@@ -12,7 +12,6 @@ class _ChildrenElementList implements ElementList {
: _childElements = element.children,
_element = element;
- bool get _inDocument() => _nodeInDocument(_element);
List<Element> _toList() {
final output = new List(_childElements.length);
for (int i = 0, len = _childElements.length; i < len; i++) {
@@ -62,7 +61,6 @@ class _ChildrenElementList implements ElementList {
}
void operator []=(int index, Element value) {
- assert(!_inMeasurementFrame || (!_inDocument && !value._inDocument));
_element.replaceChild(LevelDom.unwrap(value), _childElements.item(index));
}
@@ -72,7 +70,6 @@ class _ChildrenElementList implements ElementList {
}
Element add(Element value) {
- assert(!_inMeasurementFrame || (!_inDocument && !value._inDocument));
_element.appendChild(LevelDom.unwrap(value));
return value;
}
@@ -82,9 +79,7 @@ class _ChildrenElementList implements ElementList {
Iterator<Element> iterator() => _toList().iterator();
void addAll(Collection<Element> collection) {
- assert(!_inMeasurementFrame || !_inDocument);
for (Element element in collection) {
- assert(!_inMeasurementFrame || !element._inDocument);
_element.appendChild(LevelDom.unwrap(element));
}
}
@@ -119,13 +114,11 @@ class _ChildrenElementList implements ElementList {
}
void clear() {
- assert(!_inMeasurementFrame || !_inDocument);
// It is unclear if we want to keep non element nodes?
_element.textContent = '';
}
Element removeLast() {
- assert(!_inMeasurementFrame || !_inDocument);
final last = this.last();
if (last != null) {
_element.removeChild(LevelDom.unwrap(last));
@@ -319,12 +312,10 @@ class ElementAttributeMap implements Map<String, String> {
}
String remove(String key) {
- assert(!_inMeasurementFrame || !_nodeInDocument(_element));
_element.removeAttribute(key);
}
void clear() {
- assert(!_inMeasurementFrame || !_nodeInDocument(_element));
final attributes = _element.attributes;
for (int i = attributes.length - 1; i >= 0; i--) {
_element.removeAttribute(attributes.item(i).name);
@@ -443,52 +434,48 @@ class SimpleClientRect implements ClientRect {
String toString() => "($left, $top, $width, $height)";
}
+// TODO(jacobr): we cannot currently be lazy about calculating the client
+// rects as we must perform all measurement queries at a safe point to avoid
+// triggering unneeded layouts.
/**
- * All your element measurement needs in one place.
- * All members of this class can only be cassed when inside a measurement
- * frame or when the element is not attached to the DOM.
+ * All your element measurement needs in one place
* @domName none
*/
class ElementRectWrappingImplementation implements ElementRect {
- final dom.HTMLElement _element;
-
- ElementRectWrappingImplementation(this._element);
-
- ClientRect get client() {
- assert(window.inMeasurementFrame || !_nodeInDocument(_element));
- return new SimpleClientRect(_element.clientLeft,
- _element.clientTop,
- _element.clientWidth,
- _element.clientHeight);
- }
-
- ClientRect get offset() {
- assert(window.inMeasurementFrame || !_nodeInDocument(_element));
- return new SimpleClientRect(_element.offsetLeft,
- _element.offsetTop,
- _element.offsetWidth,
- _element.offsetHeight);
- }
-
- ClientRect get scroll() {
- assert(window.inMeasurementFrame || !_nodeInDocument(_element));
- return new SimpleClientRect(_element.scrollLeft,
- _element.scrollTop,
- _element.scrollWidth,
- _element.scrollHeight);
- }
-
- ClientRect get bounding() {
- assert(window.inMeasurementFrame || !_nodeInDocument(_element));
- return LevelDom.wrapClientRect(_element.getBoundingClientRect());
- }
+ final ClientRect client;
+ final ClientRect offset;
+ final ClientRect scroll;
+
+ // TODO(jacobr): should we move these outside of ElementRect to avoid the
+ // overhead of computing them every time even though they are rarely used.
+ // This should be type dom.ClientRect but that fails on dartium. b/5522629
+ final _boundingClientRect;
+ // an exception due to a dartium bug.
+ final _clientRects; // TODO(jacobr): should be dom.ClientRectList
+
+ ElementRectWrappingImplementation(dom.HTMLElement element) :
+ client = new SimpleClientRect(element.clientLeft,
+ element.clientTop,
+ element.clientWidth,
+ element.clientHeight),
+ offset = new SimpleClientRect(element.offsetLeft,
+ element.offsetTop,
+ element.offsetWidth,
+ element.offsetHeight),
+ scroll = new SimpleClientRect(element.scrollLeft,
+ element.scrollTop,
+ element.scrollWidth,
+ element.scrollHeight),
+ _boundingClientRect = element.getBoundingClientRect(),
+ _clientRects = element.getClientRects();
+
+ ClientRect get bounding() =>
+ LevelDom.wrapClientRect(_boundingClientRect);
List<ClientRect> get clientRects() {
- assert(window.inMeasurementFrame || !_nodeInDocument(_element));
- final clientRects = _element.getClientRects();
- final out = new List(clientRects.length);
- for (num i = 0, len = clientRects.length; i < len; i++) {
- out[i] = LevelDom.wrapClientRect(clientRects.item(i));
+ final out = new List(_clientRects.length);
+ for (num i = 0; i < _clientRects.length; i++) {
+ out[i] = LevelDom.wrapClientRect(_clientRects.item(i));
}
return out;
}
@@ -572,7 +559,6 @@ class ElementWrappingImplementation extends NodeWrappingImplementation implement
}
void set attributes(Map<String, String> value) {
- assert(!_inMeasurementFrame || !_inDocument);
Map<String, String> attributes = this.attributes;
attributes.clear();
for (String key in value.getKeys()) {
@@ -581,7 +567,6 @@ class ElementWrappingImplementation extends NodeWrappingImplementation implement
}
void set elements(Collection<Element> value) {
- assert(!_inMeasurementFrame || !_inDocument);
final elements = this.elements;
elements.clear();
elements.addAll(value);
@@ -607,7 +592,6 @@ class ElementWrappingImplementation extends NodeWrappingImplementation implement
}
void set classes(Collection<String> value) {
- assert(!_inMeasurementFrame || !_inDocument);
_CssClassSet classSet = classes;
classSet.clear();
classSet.addAll(value);
@@ -621,7 +605,6 @@ class ElementWrappingImplementation extends NodeWrappingImplementation implement
}
void set dataAttributes(Map<String, String> value) {
- assert(!_inMeasurementFrame || !_inDocument);
Map<String, String> dataAttributes = this.dataAttributes;
dataAttributes.clear();
for (String key in value.getKeys()) {
@@ -631,17 +614,11 @@ class ElementWrappingImplementation extends NodeWrappingImplementation implement
String get contentEditable() => _ptr.contentEditable;
- void set contentEditable(String value) {
- assert(!_inMeasurementFrame || !_inDocument);
- _ptr.contentEditable = value;
- }
+ void set contentEditable(String value) { _ptr.contentEditable = value; }
String get dir() => _ptr.dir;
- void set dir(String value) {
- assert(!_inMeasurementFrame || !_inDocument);
- _ptr.dir = value;
- }
+ void set dir(String value) { _ptr.dir = value; }
bool get draggable() => _ptr.draggable;
@@ -651,33 +628,21 @@ class ElementWrappingImplementation extends NodeWrappingImplementation implement
bool get hidden() => _ptr.hidden;
- void set hidden(bool value) {
- assert(!_inMeasurementFrame || !_inDocument);
- _ptr.hidden = value;
- }
+ void set hidden(bool value) { _ptr.hidden = value; }
String get id() => _ptr.id;
- void set id(String value) {
- assert(!_inMeasurementFrame || !_inDocument);
- _ptr.id = value;
- }
+ void set id(String value) { _ptr.id = value; }
String get innerHTML() => _ptr.innerHTML;
- void set innerHTML(String value) {
- assert(!_inMeasurementFrame || !_inDocument);
- _ptr.innerHTML = value;
- }
+ void set innerHTML(String value) { _ptr.innerHTML = value; }
bool get isContentEditable() => _ptr.isContentEditable;
String get lang() => _ptr.lang;
- void set lang(String value) {
- assert(!_inMeasurementFrame || !_inDocument);
- _ptr.lang = value;
- }
+ void set lang(String value) { _ptr.lang = value; }
Element get lastElementChild() => LevelDom.wrapElement(_ptr.lastElementChild);
@@ -691,46 +656,25 @@ class ElementWrappingImplementation extends NodeWrappingImplementation implement
bool get spellcheck() => _ptr.spellcheck;
- void set spellcheck(bool value) {
- assert(!_inMeasurementFrame || !_inDocument);
- _ptr.spellcheck = value;
- }
+ void set spellcheck(bool value) { _ptr.spellcheck = value; }
- CSSStyleDeclaration get style() {
- // Changes to this CSSStyleDeclaration dirty the layout so we must pass
- // the associated Element to the CSSStyleDeclaration constructor so that
- // we can compute whether the current element is attached to the document
- // which is required to decide whether modification inside a measurement
- // frame is allowed.
- final raw = _ptr.style;
- return raw.dartObjectLocalStorage !== null ?
- raw.dartObjectLocalStorage :
- new CSSStyleDeclarationWrappingImplementation._wrapWithElement(
- raw, this);
- }
+ CSSStyleDeclaration get style() => LevelDom.wrapCSSStyleDeclaration(_ptr.style);
int get tabIndex() => _ptr.tabIndex;
- void set tabIndex(int value) {
- assert(!_inMeasurementFrame || !_inDocument);
- _ptr.tabIndex = value;
- }
+ void set tabIndex(int value) { _ptr.tabIndex = value; }
String get tagName() => _ptr.tagName;
String get title() => _ptr.title;
- void set title(String value) {
- assert(!_inMeasurementFrame || !_inDocument);
- _ptr.title = value;
- }
+ void set title(String value) { _ptr.title = value; }
String get webkitdropzone() => _ptr.webkitdropzone;
void set webkitdropzone(String value) { _ptr.webkitdropzone = value; }
void blur() {
- assert(!_inMeasurementFrame || !_inDocument);
_ptr.blur();
}
@@ -739,22 +683,18 @@ class ElementWrappingImplementation extends NodeWrappingImplementation implement
}
void focus() {
- assert(!_inMeasurementFrame || !_inDocument);
_ptr.focus();
}
Element insertAdjacentElement([String where = null, Element element = null]) {
- assert(!_inMeasurementFrame || !_inDocument);
return LevelDom.wrapElement(_ptr.insertAdjacentElement(where, LevelDom.unwrap(element)));
}
void insertAdjacentHTML([String position_OR_where = null, String text = null]) {
- assert(!_inMeasurementFrame || !_inDocument);
_ptr.insertAdjacentHTML(position_OR_where, text);
}
void insertAdjacentText([String where = null, String text = null]) {
- assert(!_inMeasurementFrame || !_inDocument);
_ptr.insertAdjacentText(where, text);
}
@@ -799,21 +739,24 @@ class ElementWrappingImplementation extends NodeWrappingImplementation implement
* clientTop, clientLeft, offsetHeight, offsetWidth, offsetTop, offsetLeft,
* scrollHeight, scrollWidth, scrollTop, scrollLeft
*/
- ElementRect get rect() {
- return new ElementRectWrappingImplementation(_ptr);
+ Future<ElementRect> get rect() {
+ return _createMeasurementFuture(
+ () => new ElementRectWrappingImplementation(_ptr),
+ new Completer<ElementRect>());
}
/** @domName Window.getComputedStyle */
- CSSStyleDeclaration get computedStyle() {
+ Future<CSSStyleDeclaration> get computedStyle() {
// TODO(jacobr): last param should be null, see b/5045788
- return getComputedStyle('');
+ return getComputedStyle('');
}
/** @domName Window.getComputedStyle */
- CSSStyleDeclaration getComputedStyle(String pseudoElement) {
- assert(window.inMeasurementFrame || !_inDocument);
- return LevelDom.wrapCSSStyleDeclaration(
- dom.window.getComputedStyle(_ptr, pseudoElement));
+ Future<CSSStyleDeclaration> getComputedStyle(String pseudoElement) {
+ return _createMeasurementFuture(() =>
+ LevelDom.wrapCSSStyleDeclaration(
+ dom.window.getComputedStyle(_ptr, pseudoElement)),
+ new Completer<CSSStyleDeclaration>());
}
ElementEvents get on() {
« no previous file with comments | « client/html/src/Element.dart ('k') | client/html/src/EventTargetWrappingImplementation.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698