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

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

Issue 9537001: Generate dart:html bindings for Dartium as well as Frog. All unittests now pass (or are disabled fo… (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 8 years, 10 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: client/html/src/ElementWrappingImplementation.dart
diff --git a/client/html/src/ElementWrappingImplementation.dart b/client/html/src/ElementWrappingImplementation.dart
deleted file mode 100644
index a8c4fcb1d77df3cf41192519cb1e32881237f39e..0000000000000000000000000000000000000000
--- a/client/html/src/ElementWrappingImplementation.dart
+++ /dev/null
@@ -1,790 +0,0 @@
-// 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.
-
-// TODO(jacobr): use Lists.dart to remove some of the duplicated functionality.
-class _ChildrenElementList implements ElementList {
- // Raw Element.
- final _element;
- final _childElements;
-
- _ChildrenElementList._wrap(var element)
- : _childElements = element.children,
- _element = element;
-
- List<Element> _toList() {
- final output = new List(_childElements.length);
- for (int i = 0, len = _childElements.length; i < len; i++) {
- output[i] = LevelDom.wrapElement(_childElements[i]);
- }
- return output;
- }
-
- Element get first() {
- return LevelDom.wrapElement(_element.firstElementChild);
- }
-
- void forEach(void f(Element element)) => _toList().forEach(f);
-
- Collection map(f(Element element)) => _toList().map(f);
-
- ElementList filter(bool f(Element element)) =>
- new _ElementList(_toList().filter(f));
-
- bool every(bool f(Element element)) {
- for(Element element in this) {
- if (!f(element)) {
- return false;
- }
- };
- return true;
- }
-
- bool some(bool f(Element element)) {
- for(Element element in this) {
- if (f(element)) {
- return true;
- }
- };
- return false;
- }
-
- bool isEmpty() {
- return _element.firstElementChild === null;
- }
-
- int get length() {
- return _childElements.length;
- }
-
- Element operator [](int index) {
- return LevelDom.wrapElement(_childElements[index]);
- }
-
- void operator []=(int index, Element value) {
- _element.replaceChild(LevelDom.unwrap(value), _childElements.item(index));
- }
-
- void set length(int newLength) {
- // TODO(jacobr): remove children when length is reduced.
- throw const UnsupportedOperationException('');
- }
-
- Element add(Element value) {
- _element.appendChild(LevelDom.unwrap(value));
- return value;
- }
-
- Element addLast(Element value) => add(value);
-
- Iterator<Element> iterator() => _toList().iterator();
-
- void addAll(Collection<Element> collection) {
- for (Element element in collection) {
- _element.appendChild(LevelDom.unwrap(element));
- }
- }
-
- void sort(int compare(Element a, Element b)) {
- throw const UnsupportedOperationException('TODO(jacobr): should we impl?');
- }
-
- void copyFrom(List<Object> src, int srcStart, int dstStart, int count) {
- throw 'Not impl yet. todo(jacobr)';
- }
-
- void setRange(int start, int length, List from, [int startFrom = 0]) =>
- Lists.setRange(this, start, length, from, startFrom);
-
- void removeRange(int start, int length) =>
- Lists.removeRange(this, start, length, (i) => this[i].remove());
-
- void insertRange(int start, int length, [initialValue = null]) {
- throw const NotImplementedException();
- }
-
- ElementList getRange(int start, int length) =>
- new _ElementList(Lists.getRange(this, start, length));
-
- int indexOf(Element element, [int start = 0]) {
- return Lists.indexOf(this, element, start, this.length);
- }
-
- int lastIndexOf(Element element, [int start = null]) {
- if (start === null) start = length - 1;
- return Lists.lastIndexOf(this, element, start);
- }
-
- void clear() {
- // It is unclear if we want to keep non element nodes?
- _element.textContent = '';
- }
-
- Element removeLast() {
- final last = this.last();
- if (last != null) {
- _element.removeChild(LevelDom.unwrap(last));
- }
- return last;
- }
-
- Element last() {
- return LevelDom.wrapElement(_element.lastElementChild);
- }
-}
-
-class FrozenElementList implements ElementList {
- final _ptr;
-
- FrozenElementList._wrap(this._ptr);
-
- Element get first() {
- return this[0];
- }
-
- void forEach(void f(Element element)) {
- for (Element el in this) {
- f(el);
- }
- }
-
- Collection map(f(Element element)) {
- final out = [];
- for (Element el in this) {
- out.add(f(el));
- }
- return out;
- }
-
- ElementList filter(bool f(Element element)) {
- final out = new _ElementList([]);
- for (Element el in this) {
- if (f(el)) out.add(el);
- }
- return out;
- }
-
- bool every(bool f(Element element)) {
- for(Element element in this) {
- if (!f(element)) {
- return false;
- }
- };
- return true;
- }
-
- bool some(bool f(Element element)) {
- for(Element element in this) {
- if (f(element)) {
- return true;
- }
- };
- return false;
- }
-
- bool isEmpty() {
- return _ptr.length == 0;
- }
-
- int get length() {
- return _ptr.length;
- }
-
- Element operator [](int index) {
- return LevelDom.wrapElement(_ptr[index]);
- }
-
- void operator []=(int index, Element value) {
- throw const UnsupportedOperationException('');
- }
-
- void set length(int newLength) {
- throw const UnsupportedOperationException('');
- }
-
- void add(Element value) {
- throw const UnsupportedOperationException('');
- }
-
-
- void addLast(Element value) {
- throw const UnsupportedOperationException('');
- }
-
- Iterator<Element> iterator() => new FrozenElementListIterator(this);
-
- void addAll(Collection<Element> collection) {
- throw const UnsupportedOperationException('');
- }
-
- void sort(int compare(Element a, Element b)) {
- throw const UnsupportedOperationException('');
- }
-
- void copyFrom(List<Object> src, int srcStart, int dstStart, int count) {
- throw 'Not impl yet. todo(jacobr)';
- }
-
- void setRange(int start, int length, List from, [int startFrom = 0]) {
- throw const UnsupportedOperationException('');
- }
-
- void removeRange(int start, int length) {
- throw const UnsupportedOperationException('');
- }
-
- void insertRange(int start, int length, [initialValue = null]) {
- throw const UnsupportedOperationException('');
- }
-
- ElementList getRange(int start, int length) =>
- new _ElementList(Lists.getRange(this, start, length));
-
- int indexOf(Element element, [int start = 0]) =>
- Lists.indexOf(this, element, start, this.length);
-
- int lastIndexOf(Element element, [int start = null]) {
- if (start === null) start = length - 1;
- return Lists.lastIndexOf(this, element, start);
- }
-
- void clear() {
- throw const UnsupportedOperationException('');
- }
-
- Element removeLast() {
- throw const UnsupportedOperationException('');
- }
-
- Element last() {
- return this[length-1];
- }
-}
-
-class FrozenElementListIterator implements Iterator<Element> {
- final FrozenElementList _list;
- int _index = 0;
-
- FrozenElementListIterator(this._list);
-
- /**
- * Gets the next element in the iteration. Throws a
- * [NoMoreElementsException] if no element is left.
- */
- Element next() {
- if (!hasNext()) {
- throw const NoMoreElementsException();
- }
-
- return _list[_index++];
- }
-
- /**
- * Returns whether the [Iterator] has elements left.
- */
- bool hasNext() => _index < _list.length;
-}
-
-class _ElementList extends _ListWrapper<Element> implements ElementList {
- _ElementList(List<Element> list) : super(list);
-
- ElementList filter(bool f(Element element)) =>
- new _ElementList(super.filter(f));
-
- ElementList getRange(int start, int length) =>
- new _ElementList(super.getRange(start, length));
-}
-
-class ElementAttributeMap implements Map<String, String> {
-
- final _element;
-
- ElementAttributeMap._wrap(this._element);
-
- bool containsValue(String value) {
- final attributes = _element.attributes;
- for (int i = 0, len = attributes.length; i < len; i++) {
- if(value == attributes.item(i).value) {
- return true;
- }
- }
- return false;
- }
-
- bool containsKey(String key) {
- return _element.hasAttribute(key);
- }
-
- String operator [](String key) {
- return _element.getAttribute(key);
- }
-
- void operator []=(String key, String value) {
- _element.setAttribute(key, value);
- }
-
- String putIfAbsent(String key, String ifAbsent()) {
- if (!containsKey(key)) {
- this[key] = ifAbsent();
- }
- }
-
- String remove(String key) {
- _element.removeAttribute(key);
- }
-
- void clear() {
- final attributes = _element.attributes;
- for (int i = attributes.length - 1; i >= 0; i--) {
- _element.removeAttribute(attributes.item(i).name);
- }
- }
-
- void forEach(void f(String key, String value)) {
- final attributes = _element.attributes;
- for (int i = 0, len = attributes.length; i < len; i++) {
- final item = attributes.item(i);
- f(item.name, item.value);
- }
- }
-
- Collection<String> getKeys() {
- // TODO(jacobr): generate a lazy collection instead.
- final attributes = _element.attributes;
- final keys = new List<String>(attributes.length);
- for (int i = 0, len = attributes.length; i < len; i++) {
- keys[i] = attributes.item(i).name;
- }
- return keys;
- }
-
- Collection<String> getValues() {
- // TODO(jacobr): generate a lazy collection instead.
- final attributes = _element.attributes;
- final values = new List<String>(attributes.length);
- for (int i = 0, len = attributes.length; i < len; i++) {
- values[i] = attributes.item(i).value;
- }
- return values;
- }
-
- /**
- * The number of {key, value} pairs in the map.
- */
- int get length() {
- return _element.attributes.length;
- }
-
- /**
- * Returns true if there is no {key, value} pair in the map.
- */
- bool isEmpty() {
- return !_element.hasAttributes();
- }
-}
-
-class ElementEventsImplementation extends EventsImplementation implements ElementEvents {
- ElementEventsImplementation._wrap(_ptr) : super._wrap(_ptr);
-
- EventListenerList get abort() => _get("abort");
- EventListenerList get beforeCopy() => _get("beforecopy");
- EventListenerList get beforeCut() => _get("beforecut");
- EventListenerList get beforePaste() => _get("beforepaste");
- EventListenerList get blur() => _get("blur");
- EventListenerList get change() => _get("change");
- EventListenerList get click() => _get("click");
- EventListenerList get contextMenu() => _get("contextmenu");
- EventListenerList get copy() => _get("copy");
- EventListenerList get cut() => _get("cut");
- EventListenerList get dblClick() => _get("dblclick");
- EventListenerList get drag() => _get("drag");
- EventListenerList get dragEnd() => _get("dragend");
- EventListenerList get dragEnter() => _get("dragenter");
- EventListenerList get dragLeave() => _get("dragleave");
- EventListenerList get dragOver() => _get("dragover");
- EventListenerList get dragStart() => _get("dragstart");
- EventListenerList get drop() => _get("drop");
- EventListenerList get error() => _get("error");
- EventListenerList get focus() => _get("focus");
- EventListenerList get input() => _get("input");
- EventListenerList get invalid() => _get("invalid");
- EventListenerList get keyDown() => _get("keydown");
- EventListenerList get keyPress() => _get("keypress");
- EventListenerList get keyUp() => _get("keyup");
- EventListenerList get load() => _get("load");
- EventListenerList get mouseDown() => _get("mousedown");
- EventListenerList get mouseMove() => _get("mousemove");
- EventListenerList get mouseOut() => _get("mouseout");
- EventListenerList get mouseOver() => _get("mouseover");
- EventListenerList get mouseUp() => _get("mouseup");
- EventListenerList get mouseWheel() => _get("mousewheel");
- EventListenerList get paste() => _get("paste");
- EventListenerList get reset() => _get("reset");
- EventListenerList get scroll() => _get("scroll");
- EventListenerList get search() => _get("search");
- EventListenerList get select() => _get("select");
- EventListenerList get selectStart() => _get("selectstart");
- EventListenerList get submit() => _get("submit");
- EventListenerList get touchCancel() => _get("touchcancel");
- EventListenerList get touchEnd() => _get("touchend");
- EventListenerList get touchLeave() => _get("touchleave");
- EventListenerList get touchMove() => _get("touchmove");
- EventListenerList get touchStart() => _get("touchstart");
- EventListenerList get transitionEnd() => _get("webkitTransitionEnd");
- EventListenerList get fullscreenChange() => _get("webkitfullscreenchange");
-}
-
-class SimpleClientRect implements ClientRect {
- final num left;
- final num top;
- final num width;
- final num height;
- num get right() => left + width;
- num get bottom() => top + height;
-
- const SimpleClientRect(this.left, this.top, this.width, this.height);
-
- bool operator ==(ClientRect other) {
- return other !== null && left == other.left && top == other.top
- && width == other.width && height == other.height;
- }
-
- 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
- * @domName none
- */
-class ElementRectWrappingImplementation implements ElementRect {
- 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() {
- final out = new List(_clientRects.length);
- for (num i = 0; i < _clientRects.length; i++) {
- out[i] = LevelDom.wrapClientRect(_clientRects.item(i));
- }
- return out;
- }
-}
-
-final _START_TAG_REGEXP = const RegExp('<(\\w+)');
-
-/** @domName Element, HTMLElement */
-class ElementWrappingImplementation extends NodeWrappingImplementation implements Element {
-
- static final _CUSTOM_PARENT_TAG_MAP = const {
- 'body' : 'html',
- 'head' : 'html',
- 'caption' : 'table',
- 'td': 'tr',
- 'colgroup': 'table',
- 'col' : 'colgroup',
- 'tr' : 'tbody',
- 'tbody' : 'table',
- 'tfoot' : 'table',
- 'thead' : 'table',
- 'track' : 'audio',
- };
-
- /** @domName Document.createElement */
- factory ElementWrappingImplementation.html(String html) {
- // TODO(jacobr): this method can be made more robust and performant.
- // 1) Cache the dummy parent elements required to use innerHTML rather than
- // creating them every call.
- // 2) Verify that the html does not contain leading or trailing text nodes.
- // 3) Verify that the html does not contain both <head> and <body> tags.
- // 4) Detatch the created element from its dummy parent.
- String parentTag = 'div';
- String tag;
- final match = _START_TAG_REGEXP.firstMatch(html);
- if (match !== null) {
- tag = match.group(1).toLowerCase();
- if (_CUSTOM_PARENT_TAG_MAP.containsKey(tag)) {
- parentTag = _CUSTOM_PARENT_TAG_MAP[tag];
- }
- }
- // TODO(jacobr): make type dom.HTMLElement when dartium allows it.
- var temp = dom.document.createElement(parentTag);
- temp.innerHTML = html;
-
- Element element;
- if (temp.childElementCount == 1) {
- element = LevelDom.wrapElement(temp.firstElementChild);
- } else if (parentTag == 'html' && temp.childElementCount == 2) {
- // Work around for edge case in WebKit and possibly other browsers where
- // both body and head elements are created even though the inner html
- // only contains a head or body element.
- element = LevelDom.wrapElement(temp.children.item(tag == 'head' ? 0 : 1));
- } else {
- throw new IllegalArgumentException('HTML had ${temp.childElementCount} ' +
- 'top level elements but 1 expected');
- }
- element.remove();
- return element;
- }
-
- /** @domName Document.createElement */
- factory ElementWrappingImplementation.tag(String tag) {
- return LevelDom.wrapElement(dom.document.createElement(tag));
- }
-
- ElementWrappingImplementation._wrap(ptr) : super._wrap(ptr);
-
- ElementAttributeMap _elementAttributeMap;
- ElementList _elements;
- _CssClassSet _cssClassSet;
- _DataAttributeMap _dataAttributes;
-
- /**
- * @domName Element.hasAttribute, Element.getAttribute, Element.setAttribute,
- * Element.removeAttribute
- */
- Map<String, String> get attributes() {
- if (_elementAttributeMap === null) {
- _elementAttributeMap = new ElementAttributeMap._wrap(_ptr);
- }
- return _elementAttributeMap;
- }
-
- void set attributes(Map<String, String> value) {
- Map<String, String> attributes = this.attributes;
- attributes.clear();
- for (String key in value.getKeys()) {
- attributes[key] = value[key];
- }
- }
-
- void set elements(Collection<Element> value) {
- final elements = this.elements;
- elements.clear();
- elements.addAll(value);
- }
-
- /**
- * @domName childElementCount, firstElementChild, lastElementChild,
- * children, Node.appendChild
- */
- ElementList get elements() {
- if (_elements == null) {
- _elements = new _ChildrenElementList._wrap(_ptr);
- }
- return _elements;
- }
-
- /** @domName className, classList */
- Set<String> get classes() {
- if (_cssClassSet === null) {
- _cssClassSet = new _CssClassSet(_ptr);
- }
- return _cssClassSet;
- }
-
- void set classes(Collection<String> value) {
- _CssClassSet classSet = classes;
- classSet.clear();
- classSet.addAll(value);
- }
-
- Map<String, String> get dataAttributes() {
- if (_dataAttributes === null) {
- _dataAttributes = new _DataAttributeMap(attributes);
- }
- return _dataAttributes;
- }
-
- void set dataAttributes(Map<String, String> value) {
- Map<String, String> dataAttributes = this.dataAttributes;
- dataAttributes.clear();
- for (String key in value.getKeys()) {
- dataAttributes[key] = value[key];
- }
- }
-
- String get contentEditable() => _ptr.contentEditable;
-
- void set contentEditable(String value) { _ptr.contentEditable = value; }
-
- String get dir() => _ptr.dir;
-
- void set dir(String value) { _ptr.dir = value; }
-
- bool get draggable() => _ptr.draggable;
-
- void set draggable(bool value) { _ptr.draggable = value; }
-
- Element get firstElementChild() => LevelDom.wrapElement(_ptr.firstElementChild);
-
- bool get hidden() => _ptr.hidden;
-
- void set hidden(bool value) { _ptr.hidden = value; }
-
- String get id() => _ptr.id;
-
- void set id(String value) { _ptr.id = value; }
-
- String get innerHTML() => _ptr.innerHTML;
-
- void set innerHTML(String value) { _ptr.innerHTML = value; }
-
- bool get isContentEditable() => _ptr.isContentEditable;
-
- String get lang() => _ptr.lang;
-
- void set lang(String value) { _ptr.lang = value; }
-
- Element get lastElementChild() => LevelDom.wrapElement(_ptr.lastElementChild);
-
- Element get nextElementSibling() => LevelDom.wrapElement(_ptr.nextElementSibling);
-
- Element get offsetParent() => LevelDom.wrapElement(_ptr.offsetParent);
-
- String get outerHTML() => _ptr.outerHTML;
-
- Element get previousElementSibling() => LevelDom.wrapElement(_ptr.previousElementSibling);
-
- bool get spellcheck() => _ptr.spellcheck;
-
- void set spellcheck(bool value) { _ptr.spellcheck = value; }
-
- CSSStyleDeclaration get style() => LevelDom.wrapCSSStyleDeclaration(_ptr.style);
-
- int get tabIndex() => _ptr.tabIndex;
-
- void set tabIndex(int value) { _ptr.tabIndex = value; }
-
- String get tagName() => _ptr.tagName;
-
- String get title() => _ptr.title;
-
- void set title(String value) { _ptr.title = value; }
-
- String get webkitdropzone() => _ptr.webkitdropzone;
-
- void set webkitdropzone(String value) { _ptr.webkitdropzone = value; }
-
- void blur() {
- _ptr.blur();
- }
-
- bool contains(Node element) {
- return _ptr.contains(LevelDom.unwrap(element));
- }
-
- void focus() {
- _ptr.focus();
- }
-
- Element insertAdjacentElement([String where = null, Element element = null]) {
- return LevelDom.wrapElement(_ptr.insertAdjacentElement(where, LevelDom.unwrap(element)));
- }
-
- void insertAdjacentHTML([String position_OR_where = null, String text = null]) {
- _ptr.insertAdjacentHTML(position_OR_where, text);
- }
-
- void insertAdjacentText([String where = null, String text = null]) {
- _ptr.insertAdjacentText(where, text);
- }
-
- /** @domName querySelector, Document.getElementById */
- Element query(String selectors) {
- // TODO(jacobr): scope fix.
- return LevelDom.wrapElement(_ptr.querySelector(selectors));
- }
-
- /**
- * @domName querySelectorAll, getElementsByClassName, getElementsByTagName,
- * getElementsByTagNameNS
- */
- ElementList queryAll(String selectors) {
- // TODO(jacobr): scope fix.
- return new FrozenElementList._wrap(_ptr.querySelectorAll(selectors));
- }
-
- void scrollByLines([int lines = null]) {
- _ptr.scrollByLines(lines);
- }
-
- void scrollByPages([int pages = null]) {
- _ptr.scrollByPages(pages);
- }
-
- /** @domName scrollIntoView, scrollIntoViewIfNeeded */
- void scrollIntoView([bool centerIfNeeded = null]) {
- _ptr.scrollIntoViewIfNeeded(centerIfNeeded);
- }
-
- bool matchesSelector([String selectors = null]) {
- return _ptr.webkitMatchesSelector(selectors);
- }
-
- void set scrollLeft(int value) { _ptr.scrollLeft = value; }
-
- void set scrollTop(int value) { _ptr.scrollTop = value; }
-
- /**
- * @domName getClientRects, getBoundingClientRect, clientHeight, clientWidth,
- * clientTop, clientLeft, offsetHeight, offsetWidth, offsetTop, offsetLeft,
- * scrollHeight, scrollWidth, scrollTop, scrollLeft
- */
- Future<ElementRect> get rect() {
- return _createMeasurementFuture(
- () => new ElementRectWrappingImplementation(_ptr),
- new Completer<ElementRect>());
- }
-
- /** @domName Window.getComputedStyle */
- Future<CSSStyleDeclaration> get computedStyle() {
- // TODO(jacobr): last param should be null, see b/5045788
- return getComputedStyle('');
- }
-
- /** @domName Window.getComputedStyle */
- Future<CSSStyleDeclaration> getComputedStyle(String pseudoElement) {
- return _createMeasurementFuture(() =>
- LevelDom.wrapCSSStyleDeclaration(
- dom.window.getComputedStyle(_ptr, pseudoElement)),
- new Completer<CSSStyleDeclaration>());
- }
-
- ElementEvents get on() {
- if (_on === null) {
- _on = new ElementEventsImplementation._wrap(_ptr);
- }
- return _on;
- }
-
- Element clone(bool deep) => super.clone(deep);
-}

Powered by Google App Engine
This is Rietveld 408576698