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

Unified Diff: client/html/frog/html_frog.dart

Issue 9610011: Port DocumentFragment to the new wrapperless DOM. (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/frog/html_frog.dart
diff --git a/client/html/frog/html_frog.dart b/client/html/frog/html_frog.dart
index 4f728a82e114fdfe2b54f8a616a16f96b7a42ec3..6db2162004e6161cacd60c7e06902eaddb537825 100644
--- a/client/html/frog/html_frog.dart
+++ b/client/html/frog/html_frog.dart
@@ -4036,7 +4036,7 @@ class _ClipboardImpl implements Clipboard native "*Clipboard" {
final _DataTransferItemListImpl items;
- final List types;
+ final List<String> types;
void clearData([String type = null]) native;
@@ -4463,7 +4463,7 @@ class _DataTransferItemImpl implements DataTransferItem native "*DataTransferIte
_BlobImpl getAsFile() native;
- void getAsString(StringCallback callback) native;
+ void getAsString([StringCallback callback = null]) native;
}
class _DataTransferItemListImpl implements DataTransferItemList native "*DataTransferItemList" {
@@ -4695,7 +4695,7 @@ class _DocumentImpl extends _ElementImpl
bool execCommand(String command, bool userInterface, String value) native "return this.parentNode.execCommand(command, userInterface, value);";
- Object getCSSCanvasContext(String contextId, String name, int width, int height) native "return this.parentNode.getCSSCanvasContext(contextId, name, width, height);";
+ _CanvasRenderingContextImpl getCSSCanvasContext(String contextId, String name, int width, int height) native "return this.parentNode.getCSSCanvasContext(contextId, name, width, height);";
bool queryCommandEnabled(String command) native "return this.parentNode.queryCommandEnabled(command);";
@@ -4835,12 +4835,347 @@ class _DocumentEventsImpl extends _ElementEventsImpl implements DocumentEvents {
EventListenerList get touchStart() => _get('touchstart');
}
+// 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.
+
+class FilteredElementList implements ElementList {
+ final Node _node;
+ final NodeList _childNodes;
+
+ FilteredElementList(Node node): _childNodes = node.nodes, _node = node;
+
+ // We can't memoize this, since it's possible that children will be messed
+ // with externally to this class.
+ //
+ // TODO(nweiz): Do we really need to copy the list to make the types work out?
+ List<Element> get _filtered() =>
+ new List.from(_childNodes.filter((n) => n is Element));
+
+ // Don't use _filtered.first so we can short-circuit once we find an element.
+ Element get first() {
+ for (var node in _childNodes) {
+ if (node is Element) {
+ return node;
+ }
+ }
+ return null;
+ }
+
+ void forEach(void f(Element element)) {
+ _filtered.forEach(f);
+ }
+
+ void operator []=(int index, Element value) {
+ this[index].replaceWith(value);
+ }
+
+ void set length(int newLength) {
+ var len = this.length;
+ if (newLength >= len) {
+ return;
+ } else if (newLength < 0) {
+ throw const IllegalArgumentException("Invalid list length");
+ }
+
+ removeRange(newLength - 1, len - newLength);
+ }
+
+ void add(Element value) {
+ _childNodes.add(value);
+ }
+
+ void addAll(Collection<Element> collection) {
+ collection.forEach(add);
+ }
+
+ void addLast(Element value) {
+ add(value);
+ }
+
+ 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 const NotImplementedException();
+ }
+
+ void setRange(int start, int length, List from, [int startFrom = 0]) {
+ throw const NotImplementedException();
+ }
+
+ void removeRange(int start, int length) {
+ _filtered.getRange(start, length).forEach((el) => el.remove());
+ }
+
+ void insertRange(int start, int length, [initialValue = null]) {
+ throw const NotImplementedException();
+ }
+
+ void clear() {
+ // Currently, ElementList#clear clears even non-element nodes, so we follow
+ // that behavior.
+ _childNodes.clear();
+ }
+
+ Element removeLast() {
+ var last = this.last();
+ if (last != null) {
+ last.remove();
+ }
+ return last;
+ }
+
+ Collection map(f(Element element)) => _filtered.map(f);
+ Collection<Element> filter(bool f(Element element)) => _filtered.filter(f);
+ bool every(bool f(Element element)) => _filtered.every(f);
+ bool some(bool f(Element element)) => _filtered.some(f);
+ bool isEmpty() => _filtered.isEmpty();
+ int get length() => _filtered.length;
+ Element operator [](int index) => _filtered[index];
+ Iterator<Element> iterator() => _filtered.iterator();
+ List<Element> getRange(int start, int length) =>
+ _filtered.getRange(start, length);
+ int indexOf(Element element, [int start = 0]) =>
+ _filtered.indexOf(element, start);
+
+ int lastIndexOf(Element element, [int start = null]) {
+ if (start === null) start = length - 1;
+ return _filtered.lastIndexOf(element, start);
+ }
+
+ Element last() => _filtered.last();
+}
+
+Future<CSSStyleDeclaration> _emptyStyleFuture() {
+ return _createMeasurementFuture(() => new Element.tag('div').style,
+ new Completer<CSSStyleDeclaration>());
+}
+
+class EmptyElementRect implements ElementRect {
+ final ClientRect client = const _SimpleClientRect(0, 0, 0, 0);
+ final ClientRect offset = const _SimpleClientRect(0, 0, 0, 0);
+ final ClientRect scroll = const _SimpleClientRect(0, 0, 0, 0);
+ final ClientRect bounding = const _SimpleClientRect(0, 0, 0, 0);
+ final List<ClientRect> clientRects = const <ClientRect>[];
+
+ const EmptyElementRect();
+}
class _DocumentFragmentImpl extends _NodeImpl implements DocumentFragment native "*DocumentFragment" {
+ ElementList _elements;
+
+ ElementList get elements() {
+ if (_elements == null) {
+ _elements = new FilteredElementList(this);
+ }
+ return _elements;
+ }
+
+ // TODO: The type of value should be Collection<Element>. See http://b/5392897
+ void set elements(value) {
+ // Copy list first since we don't want liveness during iteration.
+ List copy = new List.from(value);
+ final elements = this.elements;
+ elements.clear();
+ elements.addAll(copy);
+ }
+
+ ElementList queryAll(String selectors) =>
+ new _FrozenElementList._wrap(_querySelectorAll(selectors));
+
+ String get innerHTML() {
+ var e = new Element.tag("div");
+ e.nodes.add(this.clone(true));
+ return e.innerHTML;
+ }
+
+ String get outerHTML() => innerHTML;
+
+ // TODO(nweiz): Do we want to support some variant of innerHTML for XML and/or
+ // SVG strings?
+ void set innerHTML(String value) {
+ this.nodes.clear();
+
+ var e = new Element.tag("div");
+ e.innerHTML = value;
+
+ // Copy list first since we don't want liveness during iteration.
+ List nodes = new List.from(e.nodes);
+ this.nodes.addAll(nodes);
+ }
+
+ Node _insertAdjacentNode(String where, Node node) {
+ switch (where.toLowerCase()) {
+ case "beforebegin": return null;
+ case "afterend": return null;
+ case "afterbegin":
+ this.insertBefore(node, nodes.first);
+ return node;
+ case "beforeend":
+ this.nodes.add(node);
+ return node;
+ default:
+ throw new IllegalArgumentException("Invalid position ${where}");
+ }
+ }
+
+ Element insertAdjacentElement([String where = null, Element element = null])
+ => this._insertAdjacentNode(where, element);
+
+ void insertAdjacentText([String where = null, String text = null]) {
+ this._insertAdjacentNode(where, new Text(text));
+ }
+
+ void insertAdjacentHTML(
+ [String position_OR_where = null, String text = null]) {
+ this._insertAdjacentNode(
+ position_OR_where, new DocumentFragment.html(text));
+ }
+
+ Future<ElementRect> get rect() {
+ return _createMeasurementFuture(() => const EmptyElementRect(),
+ new Completer<ElementRect>());
+ }
+
+ // If we can come up with a semi-reasonable default value for an Element
+ // getter, we'll use it. In general, these return the same values as an
+ // element that has no parent.
+ String get contentEditable() => "false";
+ bool get isContentEditable() => false;
+ bool get draggable() => false;
+ bool get hidden() => false;
+ bool get spellcheck() => false;
+ int get tabIndex() => -1;
+ String get id() => "";
+ String get title() => "";
+ String get tagName() => "";
+ String get webkitdropzone() => "";
+ Element get firstElementChild() => elements.first();
+ Element get lastElementChild() => elements.last();
+ Element get nextElementSibling() => null;
+ Element get previousElementSibling() => null;
+ Element get offsetParent() => null;
+ Element get parent() => null;
+ Map<String, String> get attributes() => const {};
+ // Issue 174: this should be a const set.
+ Set<String> get classes() => new Set<String>();
+ Map<String, String> get dataAttributes() => const {};
+ CSSStyleDeclaration get style() => new Element.tag('div').style;
+ Future<CSSStyleDeclaration> get computedStyle() =>
+ _emptyStyleFuture();
+ Future<CSSStyleDeclaration> getComputedStyle(String pseudoElement) =>
+ _emptyStyleFuture();
+ bool matchesSelector([String selectors]) => false;
+
+ // Imperative Element methods are made into no-ops, as they are on parentless
+ // elements.
+ void blur() {}
+ void focus() {}
+ void scrollByLines([int lines]) {}
+ void scrollByPages([int pages]) {}
+ void scrollIntoView([bool centerIfNeeded]) {}
+
+ // Setters throw errors rather than being no-ops because we aren't going to
+ // retain the values that were set, and erroring out seems clearer.
+ void set attributes(Map<String, String> value) {
+ throw new UnsupportedOperationException(
+ "Attributes can't be set for document fragments.");
+ }
+
+ void set classes(Collection<String> value) {
+ throw new UnsupportedOperationException(
+ "Classes can't be set for document fragments.");
+ }
+
+ void set dataAttributes(Map<String, String> value) {
+ throw new UnsupportedOperationException(
+ "Data attributes can't be set for document fragments.");
+ }
+
+ void set contentEditable(String value) {
+ throw new UnsupportedOperationException(
+ "Content editable can't be set for document fragments.");
+ }
+
+ String get dir() {
+ throw new UnsupportedOperationException(
+ "Document fragments don't support text direction.");
+ }
+
+ void set dir(String value) {
+ throw new UnsupportedOperationException(
+ "Document fragments don't support text direction.");
+ }
+
+ void set draggable(bool value) {
+ throw new UnsupportedOperationException(
+ "Draggable can't be set for document fragments.");
+ }
+
+ void set hidden(bool value) {
+ throw new UnsupportedOperationException(
+ "Hidden can't be set for document fragments.");
+ }
+
+ void set id(String value) {
+ throw new UnsupportedOperationException(
+ "ID can't be set for document fragments.");
+ }
+
+ String get lang() {
+ throw new UnsupportedOperationException(
+ "Document fragments don't support language.");
+ }
+
+ void set lang(String value) {
+ throw new UnsupportedOperationException(
+ "Document fragments don't support language.");
+ }
+
+ void set scrollLeft(int value) {
+ throw new UnsupportedOperationException(
+ "Document fragments don't support scrolling.");
+ }
+
+ void set scrollTop(int value) {
+ throw new UnsupportedOperationException(
+ "Document fragments don't support scrolling.");
+ }
+
+ void set spellcheck(bool value) {
+ throw new UnsupportedOperationException(
+ "Spellcheck can't be set for document fragments.");
+ }
+
+ void set tabIndex(int value) {
+ throw new UnsupportedOperationException(
+ "Tab index can't be set for document fragments.");
+ }
+
+ void set title(String value) {
+ throw new UnsupportedOperationException(
+ "Title can't be set for document fragments.");
+ }
+
+ void set webkitdropzone(String value) {
+ throw new UnsupportedOperationException(
+ "WebKit drop zone can't be set for document fragments.");
+ }
+
+
+ _DocumentFragmentEventsImpl get on() =>
+ new _DocumentFragmentEventsImpl(this);
_ElementImpl query(String selectors) native "return this.querySelector(selectors);";
_NodeListImpl _querySelectorAll(String selectors) native "return this.querySelectorAll(selectors);";
+
+}
+
+class _DocumentFragmentEventsImpl extends _ElementEventsImpl implements DocumentFragmentEvents {
+ _DocumentFragmentEventsImpl(_ptr) : super(_ptr);
}
class _DocumentTypeImpl extends _NodeImpl implements DocumentType native "*DocumentType" {
@@ -5478,6 +5813,8 @@ class _ElementImpl extends _NodeImpl implements Element native "*Element" {
String title;
+ bool translate;
+
final String webkitRegionOverflow;
String webkitdropzone;
@@ -6698,7 +7035,7 @@ class _IDBDatabaseImpl implements IDBDatabase native "*IDBDatabase" {
_IDBVersionChangeRequestImpl setVersion(String version) native;
- _IDBTransactionImpl transaction(var storeName_OR_storeNames, int mode) native;
+ _IDBTransactionImpl transaction(var storeName_OR_storeNames, [int mode = null]) native;
}
class _IDBDatabaseErrorImpl implements IDBDatabaseError native "*IDBDatabaseError" {
@@ -6819,7 +7156,7 @@ class _IDBObjectStoreImpl implements IDBObjectStore native "*IDBObjectStore" {
_IDBIndexImpl createIndex(String name, String keyPath) native;
- _IDBRequestImpl delete(_IDBKeyImpl key) native;
+ _IDBRequestImpl delete(var key_OR_keyRange) native;
void deleteIndex(String name) native;
@@ -13712,6 +14049,8 @@ class _Uint8ClampedArrayImpl extends _Uint8ArrayImpl implements Uint8ClampedArra
// Use implementation from Uint8Array.
// final int length;
+ void setElements(Object array, [int offset = null]) native;
+
_Uint8ClampedArrayImpl subarray(int start, [int end = null]) native;
}
@@ -14731,6 +15070,8 @@ class _WebKitCSSRegionRuleImpl extends _CSSRuleImpl implements WebKitCSSRegionRu
}
class _WebKitNamedFlowImpl implements WebKitNamedFlow native "*WebKitNamedFlow" {
+
+ final bool overflow;
}
class _WebSocketImpl extends _EventTargetImpl implements WebSocket native "*WebSocket" {
@@ -18803,7 +19144,7 @@ interface Clipboard {
final DataTransferItemList items;
- final List types;
+ final List<String> types;
void clearData([String type]);
@@ -19350,7 +19691,7 @@ interface DataTransferItem {
Blob getAsFile();
- void getAsString(StringCallback callback);
+ void getAsString([StringCallback callback]);
}
// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
@@ -19652,7 +19993,7 @@ interface Document extends HtmlElement {
bool execCommand(String command, bool userInterface, String value);
- Object getCSSCanvasContext(String contextId, String name, int width, int height);
+ CanvasRenderingContext getCSSCanvasContext(String contextId, String name, int width, int height);
bool queryCommandEnabled(String command);
@@ -19770,13 +20111,29 @@ interface DocumentEvents extends ElementEvents {
// 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.
-// WARNING: Do not edit - generated code.
+interface DocumentFragment extends Element default _DocumentFragmentFactoryProvider {
+
+ DocumentFragment();
+
+ DocumentFragment.html(String html);
+
+ // TODO(nweiz): enable these when XML and/or SVG are ported
+ // /** WARNING: Currently this doesn't work on Dartium (issue 649). */
+ // DocumentFragment.xml(String xml);
+ // DocumentFragment.svg(String svg);
-interface DocumentFragment extends Node, NodeSelector {
+ DocumentFragment clone(bool deep);
+
+
+ DocumentFragmentEvents get on();
Element query(String selectors);
NodeList _querySelectorAll(String selectors);
+
+}
+
+interface DocumentFragmentEvents extends ElementEvents {
}
// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
@@ -20179,6 +20536,8 @@ interface Element extends Node, NodeSelector default _ElementFactoryProvider {
String title;
+ bool translate;
+
final String webkitRegionOverflow;
String webkitdropzone;
@@ -21398,7 +21757,7 @@ interface IDBDatabase {
IDBVersionChangeRequest setVersion(String version);
- IDBTransaction transaction(var storeName_OR_storeNames, int mode);
+ IDBTransaction transaction(var storeName_OR_storeNames, [int mode]);
}
// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
@@ -21554,7 +21913,7 @@ interface IDBObjectStore {
IDBIndex createIndex(String name, String keyPath);
- IDBRequest delete(IDBKey key);
+ IDBRequest delete(var key_OR_keyRange);
void deleteIndex(String name);
@@ -27617,6 +27976,8 @@ interface Uint8ClampedArray extends Uint8Array default _TypedArrayFactoryProvide
final int length;
+ void setElements(Object array, [int offset]);
+
Uint8ClampedArray subarray(int start, [int end]);
}
// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
@@ -28753,6 +29114,8 @@ interface WebKitCSSRegionRule extends CSSRule {
// WARNING: Do not edit - generated code.
interface WebKitNamedFlow {
+
+ final bool overflow;
}
// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
@@ -30456,6 +30819,41 @@ class _ElementFactoryProvider {
return document._createElement(tag);
}
}
+
+class _DocumentFragmentFactoryProvider {
+ /** @domName Document.createDocumentFragment */
+ factory DocumentFragment() => document.createDocumentFragment();
+
+ factory DocumentFragment.html(String html) {
+ var fragment = new DocumentFragment();
+ fragment.innerHTML = html;
+ return fragment;
+ }
+
+ // TODO(nweiz): enable this when XML is ported.
+ // factory DocumentFragment.xml(String xml) {
+ // var fragment = new DocumentFragment();
+ // var e = new XMLElement.tag("xml");
+ // e.innerHTML = xml;
+ //
+ // // Copy list first since we don't want liveness during iteration.
+ // List nodes = new List.from(e.nodes);
+ // fragment.nodes.addAll(nodes);
+ // return fragment;
+ // }
+
+ // TODO(nweiz): enable this when SVG is ported.
+ // factory DocumentFragment.svg(String svg) {
+ // var fragment = new DocumentFragment();
+ // var e = new SVGSVGElement();
+ // e.innerHTML = svg;
+ //
+ // // Copy list first since we don't want liveness during iteration.
+ // List nodes = new List.from(e.nodes);
+ // fragment.nodes.addAll(nodes);
+ // return fragment;
+ // }
+}
// Copyright (c) 2012, 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.

Powered by Google App Engine
This is Rietveld 408576698