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

Side by Side Diff: client/html/src/ElementWrappingImplementation.dart

Issue 9148015: Example showing alternate async measurement solution (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Reply to code review comments 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 // TODO(jacobr): use Lists.dart to remove some of the duplicated functionality. 5 // TODO(jacobr): use Lists.dart to remove some of the duplicated functionality.
6 class _ChildrenElementList implements ElementList { 6 class _ChildrenElementList implements ElementList {
7 // Raw Element. 7 // Raw Element.
8 final _element; 8 final _element;
9 final _childElements; 9 final _childElements;
10 10
11 _ChildrenElementList._wrap(var element) 11 _ChildrenElementList._wrap(var element)
12 : _childElements = element.children, 12 : _childElements = element.children,
13 _element = element; 13 _element = element;
14 14
15 bool get _inDocument() => _nodeInDocument(_element);
15 List<Element> _toList() { 16 List<Element> _toList() {
16 final output = new List(_childElements.length); 17 final output = new List(_childElements.length);
17 for (int i = 0, len = _childElements.length; i < len; i++) { 18 for (int i = 0, len = _childElements.length; i < len; i++) {
18 output[i] = LevelDom.wrapElement(_childElements[i]); 19 output[i] = LevelDom.wrapElement(_childElements[i]);
19 } 20 }
20 return output; 21 return output;
21 } 22 }
22 23
23 Element get first() { 24 Element get first() {
24 return LevelDom.wrapElement(_element.firstElementChild); 25 return LevelDom.wrapElement(_element.firstElementChild);
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
72 73
73 int get length() { 74 int get length() {
74 return _childElements.length; 75 return _childElements.length;
75 } 76 }
76 77
77 Element operator [](int index) { 78 Element operator [](int index) {
78 return LevelDom.wrapElement(_childElements[index]); 79 return LevelDom.wrapElement(_childElements[index]);
79 } 80 }
80 81
81 void operator []=(int index, Element value) { 82 void operator []=(int index, Element value) {
83 assert(!_inMeasurementFrame || (!_inDocument && !value._inDocument));
82 _element.replaceChild(LevelDom.unwrap(value), _childElements.item(index)); 84 _element.replaceChild(LevelDom.unwrap(value), _childElements.item(index));
83 } 85 }
84 86
85 void set length(int newLength) { 87 void set length(int newLength) {
86 // TODO(jacobr): remove children when length is reduced. 88 // TODO(jacobr): remove children when length is reduced.
87 throw const UnsupportedOperationException(''); 89 throw const UnsupportedOperationException('');
88 } 90 }
89 91
90 Element add(Element value) { 92 Element add(Element value) {
93 assert(!_inMeasurementFrame || (!_inDocument && !value._inDocument));
91 _element.appendChild(LevelDom.unwrap(value)); 94 _element.appendChild(LevelDom.unwrap(value));
92 return value; 95 return value;
93 } 96 }
94 97
95 Element addLast(Element value) => add(value); 98 Element addLast(Element value) => add(value);
96 99
97 Iterator<Element> iterator() => _toList().iterator(); 100 Iterator<Element> iterator() => _toList().iterator();
98 101
99 void addAll(Collection<Element> collection) { 102 void addAll(Collection<Element> collection) {
103 assert(!_inMeasurementFrame || !_inDocument);
100 for (Element element in collection) { 104 for (Element element in collection) {
105 assert(!_inMeasurementFrame || !element._inDocument);
101 _element.appendChild(LevelDom.unwrap(element)); 106 _element.appendChild(LevelDom.unwrap(element));
102 } 107 }
103 } 108 }
104 109
105 void sort(int compare(Element a, Element b)) { 110 void sort(int compare(Element a, Element b)) {
106 throw const UnsupportedOperationException('TODO(jacobr): should we impl?'); 111 throw const UnsupportedOperationException('TODO(jacobr): should we impl?');
107 } 112 }
108 113
109 void copyFrom(List<Object> src, int srcStart, int dstStart, int count) { 114 void copyFrom(List<Object> src, int srcStart, int dstStart, int count) {
110 throw 'Not impl yet. todo(jacobr)'; 115 throw 'Not impl yet. todo(jacobr)';
(...skipping 18 matching lines...) Expand all
129 int indexOf(Element element, [int start = 0]) { 134 int indexOf(Element element, [int start = 0]) {
130 return _Lists.indexOf(this, element, start, this.length); 135 return _Lists.indexOf(this, element, start, this.length);
131 } 136 }
132 137
133 int lastIndexOf(Element element, [int start = null]) { 138 int lastIndexOf(Element element, [int start = null]) {
134 if (start === null) start = length - 1; 139 if (start === null) start = length - 1;
135 return _Lists.lastIndexOf(this, element, start); 140 return _Lists.lastIndexOf(this, element, start);
136 } 141 }
137 142
138 void clear() { 143 void clear() {
144 assert(!_inMeasurementFrame || !_inDocument);
139 // It is unclear if we want to keep non element nodes? 145 // It is unclear if we want to keep non element nodes?
140 _element.textContent = ''; 146 _element.textContent = '';
141 } 147 }
142 148
143 Element removeLast() { 149 Element removeLast() {
150 assert(!_inMeasurementFrame || !_inDocument);
144 final last = this.last(); 151 final last = this.last();
145 if (last != null) { 152 if (last != null) {
146 _element.removeChild(LevelDom.unwrap(last)); 153 _element.removeChild(LevelDom.unwrap(last));
147 } 154 }
148 return last; 155 return last;
149 } 156 }
150 157
151 Element last() { 158 Element last() {
152 return LevelDom.wrapElement(_element.lastElementChild); 159 return LevelDom.wrapElement(_element.lastElementChild);
153 } 160 }
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after
320 _element.setAttribute(key, value); 327 _element.setAttribute(key, value);
321 } 328 }
322 329
323 String putIfAbsent(String key, String ifAbsent()) { 330 String putIfAbsent(String key, String ifAbsent()) {
324 if (!containsKey(key)) { 331 if (!containsKey(key)) {
325 this[key] = ifAbsent(); 332 this[key] = ifAbsent();
326 } 333 }
327 } 334 }
328 335
329 String remove(String key) { 336 String remove(String key) {
337 assert(!_inMeasurementFrame || !_nodeInDocument(_element));
330 _element.removeAttribute(key); 338 _element.removeAttribute(key);
331 } 339 }
332 340
333 void clear() { 341 void clear() {
342 assert(!_inMeasurementFrame || !_nodeInDocument(_element));
334 final attributes = _element.attributes; 343 final attributes = _element.attributes;
335 for (int i = attributes.length - 1; i >= 0; i--) { 344 for (int i = attributes.length - 1; i >= 0; i--) {
336 _element.removeAttribute(attributes.item(i).name); 345 _element.removeAttribute(attributes.item(i).name);
337 } 346 }
338 } 347 }
339 348
340 void forEach(void f(String key, String value)) { 349 void forEach(void f(String key, String value)) {
341 final attributes = _element.attributes; 350 final attributes = _element.attributes;
342 for (int i = 0, len = attributes.length; i < len; i++) { 351 for (int i = 0, len = attributes.length; i < len; i++) {
343 final item = attributes.item(i); 352 final item = attributes.item(i);
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
442 const SimpleClientRect(this.left, this.top, this.width, this.height); 451 const SimpleClientRect(this.left, this.top, this.width, this.height);
443 452
444 bool operator ==(ClientRect other) { 453 bool operator ==(ClientRect other) {
445 return other !== null && left == other.left && top == other.top 454 return other !== null && left == other.left && top == other.top
446 && width == other.width && height == other.height; 455 && width == other.width && height == other.height;
447 } 456 }
448 457
449 String toString() => "($left, $top, $width, $height)"; 458 String toString() => "($left, $top, $width, $height)";
450 } 459 }
451 460
452 // TODO(jacobr): we cannot currently be lazy about calculating the client
453 // rects as we must perform all measurement queries at a safe point to avoid
454 // triggering unneeded layouts.
455 /** 461 /**
456 * All your element measurement needs in one place 462 * All your element measurement needs in one place.
463 * All members of this class can only be cassed when inside a measurement
464 * frame or when the element is not attached to the DOM.
457 * @domName none 465 * @domName none
458 */ 466 */
459 class ElementRectWrappingImplementation implements ElementRect { 467 class ElementRectWrappingImplementation implements ElementRect {
460 final ClientRect client; 468 final dom.HTMLElement _element;
461 final ClientRect offset;
462 final ClientRect scroll;
463 469
464 // TODO(jacobr): should we move these outside of ElementRect to avoid the 470 ElementRectWrappingImplementation(this._element);
465 // overhead of computing them every time even though they are rarely used.
466 // This should be type dom.ClientRect but that fails on dartium. b/5522629
467 final _boundingClientRect;
468 // an exception due to a dartium bug.
469 final _clientRects; // TODO(jacobr): should be dom.ClientRectList
470 471
471 ElementRectWrappingImplementation(dom.HTMLElement element) : 472 ClientRect get client() {
472 client = new SimpleClientRect(element.clientLeft, 473 assert(window.inMeasurementFrame || !_nodeInDocument(_element));
473 element.clientTop, 474 return new SimpleClientRect(_element.clientLeft,
474 element.clientWidth, 475 _element.clientTop,
475 element.clientHeight), 476 _element.clientWidth,
476 offset = new SimpleClientRect(element.offsetLeft, 477 _element.clientHeight);
477 element.offsetTop, 478 }
478 element.offsetWidth, 479
479 element.offsetHeight), 480 ClientRect get offset() {
480 scroll = new SimpleClientRect(element.scrollLeft, 481 assert(window.inMeasurementFrame || !_nodeInDocument(_element));
481 element.scrollTop, 482 return new SimpleClientRect(_element.offsetLeft,
482 element.scrollWidth, 483 _element.offsetTop,
483 element.scrollHeight), 484 _element.offsetWidth,
484 _boundingClientRect = element.getBoundingClientRect(), 485 _element.offsetHeight);
485 _clientRects = element.getClientRects(); 486 }
486 487
487 ClientRect get bounding() => 488 ClientRect get scroll() {
488 LevelDom.wrapClientRect(_boundingClientRect); 489 assert(window.inMeasurementFrame || !_nodeInDocument(_element));
490 return new SimpleClientRect(_element.scrollLeft,
491 _element.scrollTop,
492 _element.scrollWidth,
493 _element.scrollHeight);
494 }
495
496 ClientRect get bounding() {
497 assert(window.inMeasurementFrame || !_nodeInDocument(_element));
498 return LevelDom.wrapClientRect(_element.getBoundingClientRect());
499 }
489 500
490 List<ClientRect> get clientRects() { 501 List<ClientRect> get clientRects() {
491 final out = new List(_clientRects.length); 502 assert(window.inMeasurementFrame || !_nodeInDocument(_element));
492 for (num i = 0; i < _clientRects.length; i++) { 503 final clientRects = _element.getClientRects();
493 out[i] = LevelDom.wrapClientRect(_clientRects.item(i)); 504 final out = new List(clientRects.length);
505 for (num i = 0, len = clientRects.length; i < len; i++) {
506 out[i] = LevelDom.wrapClientRect(clientRects.item(i));
494 } 507 }
495 return out; 508 return out;
496 } 509 }
497 } 510 }
498 511
499 final _START_TAG_REGEXP = const RegExp('<(\\w+)'); 512 final _START_TAG_REGEXP = const RegExp('<(\\w+)');
500 513
501 /** @domName Element, HTMLElement */ 514 /** @domName Element, HTMLElement */
502 class ElementWrappingImplementation extends NodeWrappingImplementation implement s Element { 515 class ElementWrappingImplementation extends NodeWrappingImplementation implement s Element {
503 516
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
567 * Element.removeAttribute 580 * Element.removeAttribute
568 */ 581 */
569 Map<String, String> get attributes() { 582 Map<String, String> get attributes() {
570 if (_elementAttributeMap === null) { 583 if (_elementAttributeMap === null) {
571 _elementAttributeMap = new ElementAttributeMap._wrap(_ptr); 584 _elementAttributeMap = new ElementAttributeMap._wrap(_ptr);
572 } 585 }
573 return _elementAttributeMap; 586 return _elementAttributeMap;
574 } 587 }
575 588
576 void set attributes(Map<String, String> value) { 589 void set attributes(Map<String, String> value) {
590 assert(!_inMeasurementFrame || !_inDocument);
577 Map<String, String> attributes = this.attributes; 591 Map<String, String> attributes = this.attributes;
578 attributes.clear(); 592 attributes.clear();
579 for (String key in value.getKeys()) { 593 for (String key in value.getKeys()) {
580 attributes[key] = value[key]; 594 attributes[key] = value[key];
581 } 595 }
582 } 596 }
583 597
584 void set elements(Collection<Element> value) { 598 void set elements(Collection<Element> value) {
599 assert(!_inMeasurementFrame || !_inDocument);
585 final elements = this.elements; 600 final elements = this.elements;
586 elements.clear(); 601 elements.clear();
587 elements.addAll(value); 602 elements.addAll(value);
588 } 603 }
589 604
590 /** 605 /**
591 * @domName childElementCount, firstElementChild, lastElementChild, 606 * @domName childElementCount, firstElementChild, lastElementChild,
592 * children, Node.appendChild 607 * children, Node.appendChild
593 */ 608 */
594 ElementList get elements() { 609 ElementList get elements() {
595 if (_elements == null) { 610 if (_elements == null) {
596 _elements = new _ChildrenElementList._wrap(_ptr); 611 _elements = new _ChildrenElementList._wrap(_ptr);
597 } 612 }
598 return _elements; 613 return _elements;
599 } 614 }
600 615
601 /** @domName className, classList */ 616 /** @domName className, classList */
602 Set<String> get classes() { 617 Set<String> get classes() {
603 if (_cssClassSet === null) { 618 if (_cssClassSet === null) {
604 _cssClassSet = new _CssClassSet(_ptr); 619 _cssClassSet = new _CssClassSet(_ptr);
605 } 620 }
606 return _cssClassSet; 621 return _cssClassSet;
607 } 622 }
608 623
609 void set classes(Collection<String> value) { 624 void set classes(Collection<String> value) {
625 assert(!_inMeasurementFrame || !_inDocument);
610 _CssClassSet classSet = classes; 626 _CssClassSet classSet = classes;
611 classSet.clear(); 627 classSet.clear();
612 classSet.addAll(value); 628 classSet.addAll(value);
613 } 629 }
614 630
615 Map<String, String> get dataAttributes() { 631 Map<String, String> get dataAttributes() {
616 if (_dataAttributes === null) { 632 if (_dataAttributes === null) {
617 _dataAttributes = new _DataAttributeMap(attributes); 633 _dataAttributes = new _DataAttributeMap(attributes);
618 } 634 }
619 return _dataAttributes; 635 return _dataAttributes;
620 } 636 }
621 637
622 void set dataAttributes(Map<String, String> value) { 638 void set dataAttributes(Map<String, String> value) {
639 assert(!_inMeasurementFrame || !_inDocument);
623 Map<String, String> dataAttributes = this.dataAttributes; 640 Map<String, String> dataAttributes = this.dataAttributes;
624 dataAttributes.clear(); 641 dataAttributes.clear();
625 for (String key in value.getKeys()) { 642 for (String key in value.getKeys()) {
626 dataAttributes[key] = value[key]; 643 dataAttributes[key] = value[key];
627 } 644 }
628 } 645 }
629 646
630 String get contentEditable() => _ptr.contentEditable; 647 String get contentEditable() => _ptr.contentEditable;
631 648
649 // TODO(jacobr): does this dirty the layout?
arv (Not doing code reviews) 2012/01/17 20:25:00 Yes it does
Jacob 2012/01/21 03:01:25 Done.
632 void set contentEditable(String value) { _ptr.contentEditable = value; } 650 void set contentEditable(String value) { _ptr.contentEditable = value; }
633 651
634 String get dir() => _ptr.dir; 652 String get dir() => _ptr.dir;
635 653
636 void set dir(String value) { _ptr.dir = value; } 654 void set dir(String value) {
655 assert(!_inMeasurementFrame || !_inDocument);
656 _ptr.dir = value;
657 }
637 658
638 bool get draggable() => _ptr.draggable; 659 bool get draggable() => _ptr.draggable;
639 660
640 void set draggable(bool value) { _ptr.draggable = value; } 661 void set draggable(bool value) { _ptr.draggable = value; }
641 662
642 Element get firstElementChild() => LevelDom.wrapElement(_ptr.firstElementChild ); 663 Element get firstElementChild() => LevelDom.wrapElement(_ptr.firstElementChild );
643 664
644 bool get hidden() => _ptr.hidden; 665 bool get hidden() => _ptr.hidden;
645 666
646 void set hidden(bool value) { _ptr.hidden = value; } 667 void set hidden(bool value) {
668 assert(!_inMeasurementFrame || !_inDocument);
669 _ptr.hidden = value;
670 }
647 671
648 String get id() => _ptr.id; 672 String get id() => _ptr.id;
649 673
650 void set id(String value) { _ptr.id = value; } 674 void set id(String value) {
675 assert(!_inMeasurementFrame || !_inDocument);
676 _ptr.id = value;
677 }
651 678
652 String get innerHTML() => _ptr.innerHTML; 679 String get innerHTML() => _ptr.innerHTML;
653 680
654 void set innerHTML(String value) { _ptr.innerHTML = value; } 681 void set innerHTML(String value) {
682 assert(!_inMeasurementFrame || !_inDocument);
683 _ptr.innerHTML = value;
684 }
655 685
656 bool get isContentEditable() => _ptr.isContentEditable; 686 bool get isContentEditable() => _ptr.isContentEditable;
657 687
658 String get lang() => _ptr.lang; 688 String get lang() => _ptr.lang;
659 689
660 void set lang(String value) { _ptr.lang = value; } 690 void set lang(String value) {
691 assert(!_inMeasurementFrame || !_inDocument);
692 _ptr.lang = value;
693 }
661 694
662 Element get lastElementChild() => LevelDom.wrapElement(_ptr.lastElementChild); 695 Element get lastElementChild() => LevelDom.wrapElement(_ptr.lastElementChild);
663 696
664 Element get nextElementSibling() => LevelDom.wrapElement(_ptr.nextElementSibli ng); 697 Element get nextElementSibling() => LevelDom.wrapElement(_ptr.nextElementSibli ng);
665 698
666 Element get offsetParent() => LevelDom.wrapElement(_ptr.offsetParent); 699 Element get offsetParent() => LevelDom.wrapElement(_ptr.offsetParent);
667 700
668 String get outerHTML() => _ptr.outerHTML; 701 String get outerHTML() => _ptr.outerHTML;
669 702
670 Element get previousElementSibling() => LevelDom.wrapElement(_ptr.previousElem entSibling); 703 Element get previousElementSibling() => LevelDom.wrapElement(_ptr.previousElem entSibling);
671 704
672 bool get spellcheck() => _ptr.spellcheck; 705 bool get spellcheck() => _ptr.spellcheck;
673 706
674 void set spellcheck(bool value) { _ptr.spellcheck = value; } 707 void set spellcheck(bool value) {
708 assert(!_inMeasurementFrame || !_inDocument);
709 _ptr.spellcheck = value;
710 }
675 711
676 CSSStyleDeclaration get style() => LevelDom.wrapCSSStyleDeclaration(_ptr.style ); 712 CSSStyleDeclaration get style() {
713 // Changes to this CSSStyleDeclaration dirty the layout so we must pass
714 // the associated Element to the CSSStyleDeclaration constructor so that
715 // we can compute whether the current element is attached to the document
716 // which is required to decide whether modification inside a measurement
717 // frame is allowed.
718 final raw = _ptr.style;
719 return raw.dartObjectLocalStorage !== null ?
720 raw.dartObjectLocalStorage :
721 new CSSStyleDeclarationWrappingImplementation._wrapWithElement(
722 raw, this);
723 }
677 724
678 int get tabIndex() => _ptr.tabIndex; 725 int get tabIndex() => _ptr.tabIndex;
679 726
680 void set tabIndex(int value) { _ptr.tabIndex = value; } 727 void set tabIndex(int value) {
728 assert(!_inMeasurementFrame || !_inDocument);
729 _ptr.tabIndex = value;
730 }
681 731
682 String get tagName() => _ptr.tagName; 732 String get tagName() => _ptr.tagName;
683 733
684 String get title() => _ptr.title; 734 String get title() => _ptr.title;
685 735
686 void set title(String value) { _ptr.title = value; } 736 void set title(String value) {
737 assert(!_inMeasurementFrame || !_inDocument);
738 _ptr.title = value;
739 }
687 740
688 String get webkitdropzone() => _ptr.webkitdropzone; 741 String get webkitdropzone() => _ptr.webkitdropzone;
689 742
690 void set webkitdropzone(String value) { _ptr.webkitdropzone = value; } 743 void set webkitdropzone(String value) { _ptr.webkitdropzone = value; }
691 744
692 void blur() { 745 void blur() {
746 assert(!_inMeasurementFrame || !_inDocument);
693 _ptr.blur(); 747 _ptr.blur();
694 } 748 }
695 749
696 bool contains(Node element) { 750 bool contains(Node element) {
697 return _ptr.contains(LevelDom.unwrap(element)); 751 return _ptr.contains(LevelDom.unwrap(element));
698 } 752 }
699 753
700 void focus() { 754 void focus() {
755 assert(!_inMeasurementFrame || !_inDocument);
701 _ptr.focus(); 756 _ptr.focus();
702 } 757 }
703 758
704 Element insertAdjacentElement([String where = null, Element element = null]) { 759 Element insertAdjacentElement([String where = null, Element element = null]) {
760 assert(!_inMeasurementFrame || !_inDocument);
705 return LevelDom.wrapElement(_ptr.insertAdjacentElement(where, LevelDom.unwra p(element))); 761 return LevelDom.wrapElement(_ptr.insertAdjacentElement(where, LevelDom.unwra p(element)));
706 } 762 }
707 763
708 void insertAdjacentHTML([String position_OR_where = null, String text = null]) { 764 void insertAdjacentHTML([String position_OR_where = null, String text = null]) {
765 assert(!_inMeasurementFrame || !_inDocument);
709 _ptr.insertAdjacentHTML(position_OR_where, text); 766 _ptr.insertAdjacentHTML(position_OR_where, text);
710 } 767 }
711 768
712 void insertAdjacentText([String where = null, String text = null]) { 769 void insertAdjacentText([String where = null, String text = null]) {
770 assert(!_inMeasurementFrame || !_inDocument);
713 _ptr.insertAdjacentText(where, text); 771 _ptr.insertAdjacentText(where, text);
714 } 772 }
715 773
716 /** @domName querySelector, Document.getElementById */ 774 /** @domName querySelector, Document.getElementById */
717 Element query(String selectors) { 775 Element query(String selectors) {
718 // TODO(jacobr): scope fix. 776 // TODO(jacobr): scope fix.
719 return LevelDom.wrapElement(_ptr.querySelector(selectors)); 777 return LevelDom.wrapElement(_ptr.querySelector(selectors));
720 } 778 }
721 779
722 /** 780 /**
(...skipping 24 matching lines...) Expand all
747 805
748 void set scrollLeft(int value) { _ptr.scrollLeft = value; } 806 void set scrollLeft(int value) { _ptr.scrollLeft = value; }
749 807
750 void set scrollTop(int value) { _ptr.scrollTop = value; } 808 void set scrollTop(int value) { _ptr.scrollTop = value; }
751 809
752 /** 810 /**
753 * @domName getClientRects, getBoundingClientRect, clientHeight, clientWidth, 811 * @domName getClientRects, getBoundingClientRect, clientHeight, clientWidth,
754 * clientTop, clientLeft, offsetHeight, offsetWidth, offsetTop, offsetLeft, 812 * clientTop, clientLeft, offsetHeight, offsetWidth, offsetTop, offsetLeft,
755 * scrollHeight, scrollWidth, scrollTop, scrollLeft 813 * scrollHeight, scrollWidth, scrollTop, scrollLeft
756 */ 814 */
757 Future<ElementRect> get rect() { 815 ElementRect get rect() {
758 return _createMeasurementFuture( 816 return new ElementRectWrappingImplementation(_ptr);
759 () => new ElementRectWrappingImplementation(_ptr),
760 new Completer<ElementRect>());
761 } 817 }
762 818
763 /** @domName Window.getComputedStyle */ 819 /** @domName Window.getComputedStyle */
764 Future<CSSStyleDeclaration> get computedStyle() { 820 CSSStyleDeclaration get computedStyle() {
765 // TODO(jacobr): last param should be null, see b/5045788 821 // TODO(jacobr): last param should be null, see b/5045788
766 return getComputedStyle(''); 822 return getComputedStyle('');
767 } 823 }
768 824
769 /** @domName Window.getComputedStyle */ 825 /** @domName Window.getComputedStyle */
770 Future<CSSStyleDeclaration> getComputedStyle(String pseudoElement) { 826 CSSStyleDeclaration getComputedStyle(String pseudoElement) {
771 return _createMeasurementFuture(() => 827 assert(window.inMeasurementFrame || !_inDocument);
772 LevelDom.wrapCSSStyleDeclaration( 828 return LevelDom.wrapCSSStyleDeclaration(
773 dom.window.getComputedStyle(_ptr, pseudoElement)), 829 dom.window.getComputedStyle(_ptr, pseudoElement));
774 new Completer<CSSStyleDeclaration>());
775 } 830 }
776 831
777 ElementEvents get on() { 832 ElementEvents get on() {
778 if (_on === null) { 833 if (_on === null) {
779 _on = new ElementEventsImplementation._wrap(_ptr); 834 _on = new ElementEventsImplementation._wrap(_ptr);
780 } 835 }
781 return _on; 836 return _on;
782 } 837 }
783 838
784 Element clone(bool deep) => super.clone(deep); 839 Element clone(bool deep) => super.clone(deep);
785 } 840 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698