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

Unified Diff: tool/input_sdk/lib/html/ddc/html_ddc.dart

Issue 1528613004: First cut of mini dart:html. (Closed) Base URL: https://github.com/dart-lang/dev_compiler.git@master
Patch Set: Fix build_sdk Created 5 years 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 | « tool/input_sdk/lib/_internal/libraries.dart ('k') | tool/input_sdk/lib/html/html_common/conversions.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: tool/input_sdk/lib/html/ddc/html_ddc.dart
diff --git a/tool/input_sdk/lib/html/ddc/html_ddc.dart b/tool/input_sdk/lib/html/ddc/html_ddc.dart
new file mode 100644
index 0000000000000000000000000000000000000000..b8afc3319184ec68bbd16c3f5e4a6329aaad9a87
--- /dev/null
+++ b/tool/input_sdk/lib/html/ddc/html_ddc.dart
@@ -0,0 +1,19578 @@
+/**
+ * HTML elements and other resources for web-based applications that need to
+ * interact with the browser and the DOM (Document Object Model).
+ *
+ * This library includes DOM element types, CSS styling, local storage,
+ * media, speech, events, and more.
+ * To get started,
+ * check out the [Element] class, the base class for many of the HTML
+ * DOM types.
+ *
+ * ## Other resources
+ *
+ * * If you've never written a web app before, try our
+ * tutorials—[A Game of Darts](http://dartlang.org/docs/tutorials).
+ *
+ * * To see some web-based Dart apps in action and to play with the code,
+ * download
+ * [Dart Editor](http://www.dartlang.org/#get-started)
+ * and run its built-in examples.
+ *
+ * * For even more examples, see
+ * [Dart HTML5 Samples](https://github.com/dart-lang/dart-html5-samples)
+ * on Github.
+ */
+library dart.dom.html;
+
+import 'dart:async';
+import 'dart:collection';
+import 'dart:_internal' hide Symbol;
+import 'dart:html_common';
+import 'dart:isolate';
+import "dart:convert";
+import 'dart:math';
+import 'dart:_native_typed_data';
+import 'dart:typed_data';
+import 'dart:_isolate_helper' show IsolateNatives;
+import 'dart:_foreign_helper' show JS, JS_INTERCEPTOR_CONSTANT, JS_CONST;
+// 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.
+
+
+@DocsEditable()
+@DomName('HTMLAnchorElement')
+@Native("HTMLAnchorElement")
+class AnchorElement extends HtmlElement implements UrlUtils {
+ // To suppress missing implicit constructor warnings.
+ factory AnchorElement._() { throw new UnsupportedError("Not supported"); }
+
+ @DomName('HTMLAnchorElement.HTMLAnchorElement')
+ @DocsEditable()
+ factory AnchorElement({String href}) {
+ AnchorElement e = document.createElement("a");
+ if (href != null) e.href = href;
+ return e;
+ }
+
+
+ @Deprecated("Internal Use Only")
+ static AnchorElement internalCreateAnchorElement() {
+ return new AnchorElement.internal_();
+ }
+
+ @Deprecated("Internal Use Only")
+ AnchorElement.internal_() : super.internal_();
+
+
+ @DomName('HTMLAnchorElement.download')
+ @DocsEditable()
+ String get download => wrap_jso(JS("String", "#.download", this.raw));
+ @DomName('HTMLAnchorElement.download')
+ @DocsEditable()
+ void set download(String val) => JS("void", "#.download = #", this.raw, unwrap_jso(val));
+
+ @DomName('HTMLAnchorElement.hreflang')
+ @DocsEditable()
+ String get hreflang => wrap_jso(JS("String", "#.hreflang", this.raw));
+ @DomName('HTMLAnchorElement.hreflang')
+ @DocsEditable()
+ void set hreflang(String val) => JS("void", "#.hreflang = #", this.raw, unwrap_jso(val));
+
+ @DomName('HTMLAnchorElement.integrity')
+ @DocsEditable()
+ @Experimental() // untriaged
+ String get integrity => wrap_jso(JS("String", "#.integrity", this.raw));
+ @DomName('HTMLAnchorElement.integrity')
+ @DocsEditable()
+ @Experimental() // untriaged
+ void set integrity(String val) => JS("void", "#.integrity = #", this.raw, unwrap_jso(val));
+
+ @DomName('HTMLAnchorElement.rel')
+ @DocsEditable()
+ String get rel => wrap_jso(JS("String", "#.rel", this.raw));
+ @DomName('HTMLAnchorElement.rel')
+ @DocsEditable()
+ void set rel(String val) => JS("void", "#.rel = #", this.raw, unwrap_jso(val));
+
+ @DomName('HTMLAnchorElement.target')
+ @DocsEditable()
+ String get target => wrap_jso(JS("String", "#.target", this.raw));
+ @DomName('HTMLAnchorElement.target')
+ @DocsEditable()
+ void set target(String val) => JS("void", "#.target = #", this.raw, unwrap_jso(val));
+
+ @DomName('HTMLAnchorElement.type')
+ @DocsEditable()
+ String get type => wrap_jso(JS("String", "#.type", this.raw));
+ @DomName('HTMLAnchorElement.type')
+ @DocsEditable()
+ void set type(String val) => JS("void", "#.type = #", this.raw, unwrap_jso(val));
+
+ // From URLUtils
+
+ @DomName('HTMLAnchorElement.hash')
+ @DocsEditable()
+ String get hash => wrap_jso(JS("String", "#.hash", this.raw));
+ @DomName('HTMLAnchorElement.hash')
+ @DocsEditable()
+ void set hash(String val) => JS("void", "#.hash = #", this.raw, unwrap_jso(val));
+
+ @DomName('HTMLAnchorElement.host')
+ @DocsEditable()
+ String get host => wrap_jso(JS("String", "#.host", this.raw));
+ @DomName('HTMLAnchorElement.host')
+ @DocsEditable()
+ void set host(String val) => JS("void", "#.host = #", this.raw, unwrap_jso(val));
+
+ @DomName('HTMLAnchorElement.hostname')
+ @DocsEditable()
+ String get hostname => wrap_jso(JS("String", "#.hostname", this.raw));
+ @DomName('HTMLAnchorElement.hostname')
+ @DocsEditable()
+ void set hostname(String val) => JS("void", "#.hostname = #", this.raw, unwrap_jso(val));
+
+ @DomName('HTMLAnchorElement.href')
+ @DocsEditable()
+ String get href => wrap_jso(JS("String", "#.href", this.raw));
+ @DomName('HTMLAnchorElement.href')
+ @DocsEditable()
+ void set href(String val) => JS("void", "#.href = #", this.raw, unwrap_jso(val));
+
+ @DomName('HTMLAnchorElement.origin')
+ @DocsEditable()
+ // WebKit only
+ @Experimental() // non-standard
+ String get origin => wrap_jso(JS("String", "#.origin", this.raw));
+
+ @DomName('HTMLAnchorElement.password')
+ @DocsEditable()
+ @Experimental() // untriaged
+ String get password => wrap_jso(JS("String", "#.password", this.raw));
+ @DomName('HTMLAnchorElement.password')
+ @DocsEditable()
+ @Experimental() // untriaged
+ void set password(String val) => JS("void", "#.password = #", this.raw, unwrap_jso(val));
+
+ @DomName('HTMLAnchorElement.pathname')
+ @DocsEditable()
+ String get pathname => wrap_jso(JS("String", "#.pathname", this.raw));
+ @DomName('HTMLAnchorElement.pathname')
+ @DocsEditable()
+ void set pathname(String val) => JS("void", "#.pathname = #", this.raw, unwrap_jso(val));
+
+ @DomName('HTMLAnchorElement.port')
+ @DocsEditable()
+ String get port => wrap_jso(JS("String", "#.port", this.raw));
+ @DomName('HTMLAnchorElement.port')
+ @DocsEditable()
+ void set port(String val) => JS("void", "#.port = #", this.raw, unwrap_jso(val));
+
+ @DomName('HTMLAnchorElement.protocol')
+ @DocsEditable()
+ String get protocol => wrap_jso(JS("String", "#.protocol", this.raw));
+ @DomName('HTMLAnchorElement.protocol')
+ @DocsEditable()
+ void set protocol(String val) => JS("void", "#.protocol = #", this.raw, unwrap_jso(val));
+
+ @DomName('HTMLAnchorElement.search')
+ @DocsEditable()
+ String get search => wrap_jso(JS("String", "#.search", this.raw));
+ @DomName('HTMLAnchorElement.search')
+ @DocsEditable()
+ void set search(String val) => JS("void", "#.search = #", this.raw, unwrap_jso(val));
+
+ @DomName('HTMLAnchorElement.username')
+ @DocsEditable()
+ @Experimental() // untriaged
+ String get username => wrap_jso(JS("String", "#.username", this.raw));
+ @DomName('HTMLAnchorElement.username')
+ @DocsEditable()
+ @Experimental() // untriaged
+ void set username(String val) => JS("void", "#.username = #", this.raw, unwrap_jso(val));
+}
+// 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.
+
+
+@DocsEditable()
+@DomName('HTMLBaseElement')
+@Native("HTMLBaseElement")
+class BaseElement extends HtmlElement {
+ // To suppress missing implicit constructor warnings.
+ factory BaseElement._() { throw new UnsupportedError("Not supported"); }
+
+ @DomName('HTMLBaseElement.HTMLBaseElement')
+ @DocsEditable()
+ factory BaseElement() => document.createElement("base");
+
+
+ @Deprecated("Internal Use Only")
+ static BaseElement internalCreateBaseElement() {
+ return new BaseElement.internal_();
+ }
+
+ @Deprecated("Internal Use Only")
+ BaseElement.internal_() : super.internal_();
+
+
+ @DomName('HTMLBaseElement.href')
+ @DocsEditable()
+ String get href => wrap_jso(JS("String", "#.href", this.raw));
+ @DomName('HTMLBaseElement.href')
+ @DocsEditable()
+ void set href(String val) => JS("void", "#.href = #", this.raw, unwrap_jso(val));
+
+ @DomName('HTMLBaseElement.target')
+ @DocsEditable()
+ String get target => wrap_jso(JS("String", "#.target", this.raw));
+ @DomName('HTMLBaseElement.target')
+ @DocsEditable()
+ void set target(String val) => JS("void", "#.target = #", this.raw, unwrap_jso(val));
+}
+// 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.
+
+
+@DocsEditable()
+@DomName('HTMLBodyElement')
+@Native("HTMLBodyElement")
+class BodyElement extends HtmlElement {
+ // To suppress missing implicit constructor warnings.
+ factory BodyElement._() { throw new UnsupportedError("Not supported"); }
+
+ /**
+ * Static factory designed to expose `blur` events to event
+ * handlers that are not necessarily instances of [BodyElement].
+ *
+ * See [EventStreamProvider] for usage information.
+ */
+ @DomName('HTMLBodyElement.blurEvent')
+ @DocsEditable()
+ static const EventStreamProvider<Event> blurEvent = const EventStreamProvider<Event>('blur');
+
+ /**
+ * Static factory designed to expose `error` events to event
+ * handlers that are not necessarily instances of [BodyElement].
+ *
+ * See [EventStreamProvider] for usage information.
+ */
+ @DomName('HTMLBodyElement.errorEvent')
+ @DocsEditable()
+ static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
+
+ /**
+ * Static factory designed to expose `focus` events to event
+ * handlers that are not necessarily instances of [BodyElement].
+ *
+ * See [EventStreamProvider] for usage information.
+ */
+ @DomName('HTMLBodyElement.focusEvent')
+ @DocsEditable()
+ static const EventStreamProvider<Event> focusEvent = const EventStreamProvider<Event>('focus');
+
+ /**
+ * Static factory designed to expose `load` events to event
+ * handlers that are not necessarily instances of [BodyElement].
+ *
+ * See [EventStreamProvider] for usage information.
+ */
+ @DomName('HTMLBodyElement.loadEvent')
+ @DocsEditable()
+ static const EventStreamProvider<Event> loadEvent = const EventStreamProvider<Event>('load');
+
+ /**
+ * Static factory designed to expose `resize` events to event
+ * handlers that are not necessarily instances of [BodyElement].
+ *
+ * See [EventStreamProvider] for usage information.
+ */
+ @DomName('HTMLBodyElement.resizeEvent')
+ @DocsEditable()
+ static const EventStreamProvider<Event> resizeEvent = const EventStreamProvider<Event>('resize');
+
+ @DomName('HTMLBodyElement.scrollEvent')
+ @DocsEditable()
+ @Experimental() // untriaged
+ static const EventStreamProvider<Event> scrollEvent = const EventStreamProvider<Event>('scroll');
+
+ @DomName('HTMLBodyElement.HTMLBodyElement')
+ @DocsEditable()
+ factory BodyElement() => document.createElement("body");
+
+
+ @Deprecated("Internal Use Only")
+ static BodyElement internalCreateBodyElement() {
+ return new BodyElement.internal_();
+ }
+
+ @Deprecated("Internal Use Only")
+ BodyElement.internal_() : super.internal_();
+
+
+ /// Stream of `blur` events handled by this [BodyElement].
+ @DomName('HTMLBodyElement.onblur')
+ @DocsEditable()
+ ElementStream<Event> get onBlur => blurEvent.forElement(this);
+
+ /// Stream of `error` events handled by this [BodyElement].
+ @DomName('HTMLBodyElement.onerror')
+ @DocsEditable()
+ ElementStream<Event> get onError => errorEvent.forElement(this);
+
+ /// Stream of `focus` events handled by this [BodyElement].
+ @DomName('HTMLBodyElement.onfocus')
+ @DocsEditable()
+ ElementStream<Event> get onFocus => focusEvent.forElement(this);
+
+ /// Stream of `load` events handled by this [BodyElement].
+ @DomName('HTMLBodyElement.onload')
+ @DocsEditable()
+ ElementStream<Event> get onLoad => loadEvent.forElement(this);
+
+ /// Stream of `resize` events handled by this [BodyElement].
+ @DomName('HTMLBodyElement.onresize')
+ @DocsEditable()
+ ElementStream<Event> get onResize => resizeEvent.forElement(this);
+
+ @DomName('HTMLBodyElement.onscroll')
+ @DocsEditable()
+ @Experimental() // untriaged
+ ElementStream<Event> get onScroll => scrollEvent.forElement(this);
+}
+// 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.
+
+
+@DocsEditable()
+@DomName('CharacterData')
+@Native("CharacterData")
+class CharacterData extends Node implements ChildNode {
+ // To suppress missing implicit constructor warnings.
+ factory CharacterData._() { throw new UnsupportedError("Not supported"); }
+
+
+ @Deprecated("Internal Use Only")
+ static CharacterData internalCreateCharacterData() {
+ return new CharacterData.internal_();
+ }
+
+ @Deprecated("Internal Use Only")
+ CharacterData.internal_() : super.internal_();
+
+
+ @DomName('CharacterData.data')
+ @DocsEditable()
+ String get data => wrap_jso(JS("String", "#.data", this.raw));
+ @DomName('CharacterData.data')
+ @DocsEditable()
+ void set data(String val) => JS("void", "#.data = #", this.raw, unwrap_jso(val));
+
+ @DomName('CharacterData.length')
+ @DocsEditable()
+ int get length => wrap_jso(JS("int", "#.length", this.raw));
+
+ @DomName('CharacterData.appendData')
+ @DocsEditable()
+ void appendData(String data) {
+ _appendData_1(data);
+ return;
+ }
+ @JSName('appendData')
+ @DomName('CharacterData.appendData')
+ @DocsEditable()
+ void _appendData_1(data) => wrap_jso(JS("void ", "#.raw.appendData(#)", this, unwrap_jso(data)));
+
+ @DomName('CharacterData.deleteData')
+ @DocsEditable()
+ void deleteData(int offset, int length) {
+ _deleteData_1(offset, length);
+ return;
+ }
+ @JSName('deleteData')
+ @DomName('CharacterData.deleteData')
+ @DocsEditable()
+ void _deleteData_1(offset, length) => wrap_jso(JS("void ", "#.raw.deleteData(#, #)", this, unwrap_jso(offset), unwrap_jso(length)));
+
+ @DomName('CharacterData.insertData')
+ @DocsEditable()
+ void insertData(int offset, String data) {
+ _insertData_1(offset, data);
+ return;
+ }
+ @JSName('insertData')
+ @DomName('CharacterData.insertData')
+ @DocsEditable()
+ void _insertData_1(offset, data) => wrap_jso(JS("void ", "#.raw.insertData(#, #)", this, unwrap_jso(offset), unwrap_jso(data)));
+
+ @DomName('CharacterData.replaceData')
+ @DocsEditable()
+ void replaceData(int offset, int length, String data) {
+ _replaceData_1(offset, length, data);
+ return;
+ }
+ @JSName('replaceData')
+ @DomName('CharacterData.replaceData')
+ @DocsEditable()
+ void _replaceData_1(offset, length, data) => wrap_jso(JS("void ", "#.raw.replaceData(#, #, #)", this, unwrap_jso(offset), unwrap_jso(length), unwrap_jso(data)));
+
+ @DomName('CharacterData.substringData')
+ @DocsEditable()
+ String substringData(int offset, int length) {
+ return _substringData_1(offset, length);
+ }
+ @JSName('substringData')
+ @DomName('CharacterData.substringData')
+ @DocsEditable()
+ String _substringData_1(offset, length) => wrap_jso(JS("String ", "#.raw.substringData(#, #)", this, unwrap_jso(offset), unwrap_jso(length)));
+
+ // From ChildNode
+
+ @DomName('CharacterData.nextElementSibling')
+ @DocsEditable()
+ Element get nextElementSibling => wrap_jso(JS("Element", "#.nextElementSibling", this.raw));
+
+ @DomName('CharacterData.previousElementSibling')
+ @DocsEditable()
+ Element get previousElementSibling => wrap_jso(JS("Element", "#.previousElementSibling", this.raw));
+}
+// 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.
+
+
+@DocsEditable()
+@DomName('ChildNode')
+@Experimental() // untriaged
+abstract class ChildNode extends DartHtmlDomObject {
+ // To suppress missing implicit constructor warnings.
+ factory ChildNode._() { throw new UnsupportedError("Not supported"); }
+
+ Element get nextElementSibling => wrap_jso(JS("Element", "#.nextElementSibling", this.raw));
+
+ Element get previousElementSibling => wrap_jso(JS("Element", "#.previousElementSibling", this.raw));
+
+ void remove() => wrap_jso(JS("void", "#.raw.remove()", this));
+}
+// 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.
+
+
+@DomName('Console')
+class Console extends DartHtmlDomObject {
+
+ Console._safe();
+
+ static final Console _safeConsole = new Console._safe();
+
+ bool get _isConsoleDefined => JS('bool', 'typeof console != "undefined"');
+
+ @DomName('Console.assertCondition')
+ void assertCondition(bool condition, Object arg) => _isConsoleDefined ?
+ JS('void', 'console.assertCondition(#, #)', condition, arg) : null;
+
+ @DomName('Console.clear')
+ void clear(Object arg) => _isConsoleDefined ?
+ JS('void', 'console.clear(#)', arg) : null;
+
+ @DomName('Console.count')
+ void count(Object arg) => _isConsoleDefined ?
+ JS('void', 'console.count(#)', arg) : null;
+
+ @DomName('Console.debug')
+ void debug(Object arg) => _isConsoleDefined ?
+ JS('void', 'console.debug(#)', arg) : null;
+
+ @DomName('Console.dir')
+ void dir(Object arg) => _isConsoleDefined ?
+ JS('void', 'console.dir(#)', arg) : null;
+
+ @DomName('Console.dirxml')
+ void dirxml(Object arg) => _isConsoleDefined ?
+ JS('void', 'console.dirxml(#)', arg) : null;
+
+ @DomName('Console.error')
+ void error(Object arg) => _isConsoleDefined ?
+ JS('void', 'console.error(#)', arg) : null;
+
+ @DomName('Console.group')
+ void group(Object arg) => _isConsoleDefined ?
+ JS('void', 'console.group(#)', arg) : null;
+
+ @DomName('Console.groupCollapsed')
+ void groupCollapsed(Object arg) => _isConsoleDefined ?
+ JS('void', 'console.groupCollapsed(#)', arg) : null;
+
+ @DomName('Console.groupEnd')
+ void groupEnd() => _isConsoleDefined ?
+ JS('void', 'console.groupEnd()') : null;
+
+ @DomName('Console.info')
+ void info(Object arg) => _isConsoleDefined ?
+ JS('void', 'console.info(#)', arg) : null;
+
+ @DomName('Console.log')
+ void log(Object arg) => _isConsoleDefined ?
+ JS('void', 'console.log(#)', arg) : null;
+
+ @DomName('Console.markTimeline')
+ void markTimeline(Object arg) => _isConsoleDefined ?
+ JS('void', 'console.markTimeline(#)', arg) : null;
+
+ @DomName('Console.profile')
+ void profile(String title) => _isConsoleDefined ?
+ JS('void', 'console.profile(#)', title) : null;
+
+ @DomName('Console.profileEnd')
+ void profileEnd(String title) => _isConsoleDefined ?
+ JS('void', 'console.profileEnd(#)', title) : null;
+
+ @DomName('Console.table')
+ void table(Object arg) => _isConsoleDefined ?
+ JS('void', 'console.table(#)', arg) : null;
+
+ @DomName('Console.time')
+ void time(String title) => _isConsoleDefined ?
+ JS('void', 'console.time(#)', title) : null;
+
+ @DomName('Console.timeEnd')
+ void timeEnd(String title) => _isConsoleDefined ?
+ JS('void', 'console.timeEnd(#)', title) : null;
+
+ @DomName('Console.timeStamp')
+ void timeStamp(Object arg) => _isConsoleDefined ?
+ JS('void', 'console.timeStamp(#)', arg) : null;
+
+ @DomName('Console.trace')
+ void trace(Object arg) => _isConsoleDefined ?
+ JS('void', 'console.trace(#)', arg) : null;
+
+ @DomName('Console.warn')
+ void warn(Object arg) => _isConsoleDefined ?
+ JS('void', 'console.warn(#)', arg) : null;
+ // To suppress missing implicit constructor warnings.
+ factory Console._() { throw new UnsupportedError("Not supported"); }
+
+
+ @Deprecated("Internal Use Only")
+ static Console internalCreateConsole() {
+ return new Console.internal_();
+ }
+
+ @Deprecated("Internal Use Only")
+ Console.internal_() : super.internal_();
+
+
+}
+// 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.
+
+
+@DocsEditable()
+@DomName('ConsoleBase')
+@Experimental() // untriaged
+@Native("ConsoleBase")
+class ConsoleBase extends DartHtmlDomObject {
+ // To suppress missing implicit constructor warnings.
+ factory ConsoleBase._() { throw new UnsupportedError("Not supported"); }
+
+ @Deprecated("Internal Use Only")
+ static ConsoleBase internalCreateConsoleBase() {
+ return new ConsoleBase.internal_();
+ }
+
+ @Deprecated("Internal Use Only")
+ ConsoleBase.internal_() { }
+
+ bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+ int get hashCode => unwrap_jso(this).hashCode;
+
+ @DomName('ConsoleBase.timeline')
+ @DocsEditable()
+ @Experimental() // untriaged
+ void timeline(String title) {
+ _timeline_1(title);
+ return;
+ }
+ @JSName('timeline')
+ @DomName('ConsoleBase.timeline')
+ @DocsEditable()
+ @Experimental() // untriaged
+ void _timeline_1(title) => wrap_jso(JS("void ", "#.raw.timeline(#)", this, unwrap_jso(title)));
+
+ @DomName('ConsoleBase.timelineEnd')
+ @DocsEditable()
+ @Experimental() // untriaged
+ void timelineEnd(String title) {
+ _timelineEnd_1(title);
+ return;
+ }
+ @JSName('timelineEnd')
+ @DomName('ConsoleBase.timelineEnd')
+ @DocsEditable()
+ @Experimental() // untriaged
+ void _timelineEnd_1(title) => wrap_jso(JS("void ", "#.raw.timelineEnd(#)", this, unwrap_jso(title)));
+}
+
+// Copyright (c) 2014, 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.
+
+// WARNING: DO NOT EDIT THIS TEMPLATE FILE.
+// The template file was generated by scripts/css_code_generator.py
+
+// Source of CSS properties:
+// CSSPropertyNames.in
+
+
+@DomName('CSSStyleDeclaration')
+@Native("CSSStyleDeclaration,MSStyleCSSProperties,CSS2Properties")
+class CssStyleDeclaration extends DartHtmlDomObject with
+ CssStyleDeclarationBase {
+ factory CssStyleDeclaration() => new CssStyleDeclaration.css('');
+
+ factory CssStyleDeclaration.css(String css) {
+ final style = new Element.tag('div').style;
+ style.cssText = css;
+ return style;
+ }
+
+ String getPropertyValue(String propertyName) {
+ var propValue = _getPropertyValueHelper(propertyName);
+ return propValue != null ? propValue : '';
+ }
+
+ String _getPropertyValueHelper(String propertyName) {
+ if (_supportsProperty(_camelCase(propertyName))) {
+ return _getPropertyValue(propertyName);
+ } else {
+ return _getPropertyValue(Device.cssPrefix + propertyName);
+ }
+ }
+
+ /**
+ * Returns true if the provided *CSS* property name is supported on this
+ * element.
+ *
+ * Please note the property name camelCase, not-hyphens. This
+ * method returns true if the property is accessible via an unprefixed _or_
+ * prefixed property.
+ */
+ bool supportsProperty(String propertyName) {
+ return _supportsProperty(propertyName) ||
+ _supportsProperty(_camelCase(Device.cssPrefix + propertyName));
+ }
+
+ bool _supportsProperty(String propertyName) {
+ return JS('bool', '# in #', propertyName, this.raw);
+ }
+
+
+ @DomName('CSSStyleDeclaration.setProperty')
+ void setProperty(String propertyName, String value, [String priority]) {
+ return _setPropertyHelper(_browserPropertyName(propertyName),
+ value, priority);
+ }
+
+ String _browserPropertyName(String propertyName) {
+ String name = _readCache(propertyName);
+ if (name is String) return name;
+ if (_supportsProperty(_camelCase(propertyName))) {
+ name = propertyName;
+ } else {
+ name = Device.cssPrefix + propertyName;
+ }
+ _writeCache(propertyName, name);
+ return name;
+ }
+
+ static String _readCache(String key) => null;
+ static void _writeCache(String key, value) {}
+
+ static String _camelCase(String hyphenated) {
+ // The "ms" prefix is always lowercased.
+ return hyphenated.replaceFirst(new RegExp('^-ms-'), 'ms-').replaceAllMapped(
+ new RegExp('-([a-z]+)', caseSensitive: false),
+ (match) => match[0][1].toUpperCase() + match[0].substring(2));
+ }
+
+ void _setPropertyHelper(String propertyName, String value, [String priority]) {
+ if (value == null) value = '';
+ if (priority == null) priority = '';
+ JS('void', '#.setProperty(#, #, #)', this.raw, propertyName, value, priority);
+ }
+
+ /**
+ * Checks to see if CSS Transitions are supported.
+ */
+ static bool get supportsTransitions {
+ return document.body.style.supportsProperty('transition');
+ }
+ // To suppress missing implicit constructor warnings.
+ factory CssStyleDeclaration._() { throw new UnsupportedError("Not supported"); }
+
+ @Deprecated("Internal Use Only")
+ static CssStyleDeclaration internalCreateCssStyleDeclaration() {
+ return new CssStyleDeclaration.internal_();
+ }
+
+ @Deprecated("Internal Use Only")
+ CssStyleDeclaration.internal_() { }
+
+ bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+ int get hashCode => unwrap_jso(this).hashCode;
+
+ @DomName('CSSStyleDeclaration.cssText')
+ @DocsEditable()
+ String get cssText => wrap_jso(JS("String", "#.cssText", this.raw));
+ @DomName('CSSStyleDeclaration.cssText')
+ @DocsEditable()
+ void set cssText(String val) => JS("void", "#.cssText = #", this.raw, unwrap_jso(val));
+
+ @DomName('CSSStyleDeclaration.length')
+ @DocsEditable()
+ int get length => wrap_jso(JS("int", "#.length", this.raw));
+
+ @DomName('CSSStyleDeclaration.__getter__')
+ @DocsEditable()
+ @Experimental() // untriaged
+ Object __getter__(String name) {
+ return __getter___1(name);
+ }
+ @JSName('__getter__')
+ @DomName('CSSStyleDeclaration.__getter__')
+ @DocsEditable()
+ @Experimental() // untriaged
+ Object __getter___1(name) => wrap_jso(JS("Object ", "#.raw.__getter__(#)", this, unwrap_jso(name)));
+
+ @DomName('CSSStyleDeclaration.__setter__')
+ @DocsEditable()
+ void __setter__(String propertyName, String propertyValue) {
+ __setter___1(propertyName, propertyValue);
+ return;
+ }
+ @JSName('__setter__')
+ @DomName('CSSStyleDeclaration.__setter__')
+ @DocsEditable()
+ void __setter___1(propertyName, propertyValue) => wrap_jso(JS("void ", "#.raw.__setter__(#, #)", this, unwrap_jso(propertyName), unwrap_jso(propertyValue)));
+
+ @DomName('CSSStyleDeclaration.getPropertyPriority')
+ @DocsEditable()
+ String getPropertyPriority(String propertyName) {
+ return _getPropertyPriority_1(propertyName);
+ }
+ @JSName('getPropertyPriority')
+ @DomName('CSSStyleDeclaration.getPropertyPriority')
+ @DocsEditable()
+ String _getPropertyPriority_1(propertyName) => wrap_jso(JS("String ", "#.raw.getPropertyPriority(#)", this, unwrap_jso(propertyName)));
+
+ @DomName('CSSStyleDeclaration.getPropertyValue')
+ @DocsEditable()
+ String _getPropertyValue(String propertyName) {
+ return _getPropertyValue_1(propertyName);
+ }
+ @JSName('getPropertyValue')
+ @DomName('CSSStyleDeclaration.getPropertyValue')
+ @DocsEditable()
+ String _getPropertyValue_1(propertyName) => wrap_jso(JS("String ", "#.raw.getPropertyValue(#)", this, unwrap_jso(propertyName)));
+
+ @DomName('CSSStyleDeclaration.item')
+ @DocsEditable()
+ String item(int index) {
+ return _item_1(index);
+ }
+ @JSName('item')
+ @DomName('CSSStyleDeclaration.item')
+ @DocsEditable()
+ String _item_1(index) => wrap_jso(JS("String ", "#.raw.item(#)", this, unwrap_jso(index)));
+
+ @DomName('CSSStyleDeclaration.removeProperty')
+ @DocsEditable()
+ String removeProperty(String propertyName) {
+ return _removeProperty_1(propertyName);
+ }
+ @JSName('removeProperty')
+ @DomName('CSSStyleDeclaration.removeProperty')
+ @DocsEditable()
+ String _removeProperty_1(propertyName) => wrap_jso(JS("String ", "#.raw.removeProperty(#)", this, unwrap_jso(propertyName)));
+
+}
+
+class _CssStyleDeclarationSet extends Object with CssStyleDeclarationBase {
+ final Iterable<Element> _elementIterable;
+ Iterable<CssStyleDeclaration> _elementCssStyleDeclarationSetIterable;
+
+ _CssStyleDeclarationSet(this._elementIterable) {
+ _elementCssStyleDeclarationSetIterable = new List.from(
+ _elementIterable).map((e) => e.style);
+ }
+
+ String getPropertyValue(String propertyName) =>
+ _elementCssStyleDeclarationSetIterable.first.getPropertyValue(
+ propertyName);
+
+ void setProperty(String propertyName, String value, [String priority]) {
+ _elementCssStyleDeclarationSetIterable.forEach((e) =>
+ e.setProperty(propertyName, value, priority));
+ }
+
+
+
+ // Important note: CssStyleDeclarationSet does NOT implement every method
+ // available in CssStyleDeclaration. Some of the methods don't make so much
+ // sense in terms of having a resonable value to return when you're
+ // considering a list of Elements. You will need to manually add any of the
+ // items in the MEMBERS set if you want that functionality.
+}
+
+class CssStyleDeclarationBase {
+ String getPropertyValue(String propertyName) =>
+ throw new StateError('getProperty not overridden in dart:html');
+ void setProperty(String propertyName, String value, [String priority]) =>
+ throw new StateError('setProperty not overridden in dart:html');
+
+ /** Gets the value of "align-content" */
+ String get alignContent =>
+ getPropertyValue('align-content');
+
+ /** Sets the value of "align-content" */
+ set alignContent(String value) {
+ setProperty('align-content', value, '');
+ }
+
+ /** Gets the value of "align-items" */
+ String get alignItems =>
+ getPropertyValue('align-items');
+
+ /** Sets the value of "align-items" */
+ set alignItems(String value) {
+ setProperty('align-items', value, '');
+ }
+
+ /** Gets the value of "align-self" */
+ String get alignSelf =>
+ getPropertyValue('align-self');
+
+ /** Sets the value of "align-self" */
+ set alignSelf(String value) {
+ setProperty('align-self', value, '');
+ }
+
+ /** Gets the value of "animation" */
+ String get animation =>
+ getPropertyValue('animation');
+
+ /** Sets the value of "animation" */
+ set animation(String value) {
+ setProperty('animation', value, '');
+ }
+
+ /** Gets the value of "animation-delay" */
+ String get animationDelay =>
+ getPropertyValue('animation-delay');
+
+ /** Sets the value of "animation-delay" */
+ set animationDelay(String value) {
+ setProperty('animation-delay', value, '');
+ }
+
+ /** Gets the value of "animation-direction" */
+ String get animationDirection =>
+ getPropertyValue('animation-direction');
+
+ /** Sets the value of "animation-direction" */
+ set animationDirection(String value) {
+ setProperty('animation-direction', value, '');
+ }
+
+ /** Gets the value of "animation-duration" */
+ String get animationDuration =>
+ getPropertyValue('animation-duration');
+
+ /** Sets the value of "animation-duration" */
+ set animationDuration(String value) {
+ setProperty('animation-duration', value, '');
+ }
+
+ /** Gets the value of "animation-fill-mode" */
+ String get animationFillMode =>
+ getPropertyValue('animation-fill-mode');
+
+ /** Sets the value of "animation-fill-mode" */
+ set animationFillMode(String value) {
+ setProperty('animation-fill-mode', value, '');
+ }
+
+ /** Gets the value of "animation-iteration-count" */
+ String get animationIterationCount =>
+ getPropertyValue('animation-iteration-count');
+
+ /** Sets the value of "animation-iteration-count" */
+ set animationIterationCount(String value) {
+ setProperty('animation-iteration-count', value, '');
+ }
+
+ /** Gets the value of "animation-name" */
+ String get animationName =>
+ getPropertyValue('animation-name');
+
+ /** Sets the value of "animation-name" */
+ set animationName(String value) {
+ setProperty('animation-name', value, '');
+ }
+
+ /** Gets the value of "animation-play-state" */
+ String get animationPlayState =>
+ getPropertyValue('animation-play-state');
+
+ /** Sets the value of "animation-play-state" */
+ set animationPlayState(String value) {
+ setProperty('animation-play-state', value, '');
+ }
+
+ /** Gets the value of "animation-timing-function" */
+ String get animationTimingFunction =>
+ getPropertyValue('animation-timing-function');
+
+ /** Sets the value of "animation-timing-function" */
+ set animationTimingFunction(String value) {
+ setProperty('animation-timing-function', value, '');
+ }
+
+ /** Gets the value of "app-region" */
+ String get appRegion =>
+ getPropertyValue('app-region');
+
+ /** Sets the value of "app-region" */
+ set appRegion(String value) {
+ setProperty('app-region', value, '');
+ }
+
+ /** Gets the value of "appearance" */
+ String get appearance =>
+ getPropertyValue('appearance');
+
+ /** Sets the value of "appearance" */
+ set appearance(String value) {
+ setProperty('appearance', value, '');
+ }
+
+ /** Gets the value of "aspect-ratio" */
+ String get aspectRatio =>
+ getPropertyValue('aspect-ratio');
+
+ /** Sets the value of "aspect-ratio" */
+ set aspectRatio(String value) {
+ setProperty('aspect-ratio', value, '');
+ }
+
+ /** Gets the value of "backface-visibility" */
+ String get backfaceVisibility =>
+ getPropertyValue('backface-visibility');
+
+ /** Sets the value of "backface-visibility" */
+ set backfaceVisibility(String value) {
+ setProperty('backface-visibility', value, '');
+ }
+
+ /** Gets the value of "background" */
+ String get background =>
+ getPropertyValue('background');
+
+ /** Sets the value of "background" */
+ set background(String value) {
+ setProperty('background', value, '');
+ }
+
+ /** Gets the value of "background-attachment" */
+ String get backgroundAttachment =>
+ getPropertyValue('background-attachment');
+
+ /** Sets the value of "background-attachment" */
+ set backgroundAttachment(String value) {
+ setProperty('background-attachment', value, '');
+ }
+
+ /** Gets the value of "background-blend-mode" */
+ String get backgroundBlendMode =>
+ getPropertyValue('background-blend-mode');
+
+ /** Sets the value of "background-blend-mode" */
+ set backgroundBlendMode(String value) {
+ setProperty('background-blend-mode', value, '');
+ }
+
+ /** Gets the value of "background-clip" */
+ String get backgroundClip =>
+ getPropertyValue('background-clip');
+
+ /** Sets the value of "background-clip" */
+ set backgroundClip(String value) {
+ setProperty('background-clip', value, '');
+ }
+
+ /** Gets the value of "background-color" */
+ String get backgroundColor =>
+ getPropertyValue('background-color');
+
+ /** Sets the value of "background-color" */
+ set backgroundColor(String value) {
+ setProperty('background-color', value, '');
+ }
+
+ /** Gets the value of "background-composite" */
+ String get backgroundComposite =>
+ getPropertyValue('background-composite');
+
+ /** Sets the value of "background-composite" */
+ set backgroundComposite(String value) {
+ setProperty('background-composite', value, '');
+ }
+
+ /** Gets the value of "background-image" */
+ String get backgroundImage =>
+ getPropertyValue('background-image');
+
+ /** Sets the value of "background-image" */
+ set backgroundImage(String value) {
+ setProperty('background-image', value, '');
+ }
+
+ /** Gets the value of "background-origin" */
+ String get backgroundOrigin =>
+ getPropertyValue('background-origin');
+
+ /** Sets the value of "background-origin" */
+ set backgroundOrigin(String value) {
+ setProperty('background-origin', value, '');
+ }
+
+ /** Gets the value of "background-position" */
+ String get backgroundPosition =>
+ getPropertyValue('background-position');
+
+ /** Sets the value of "background-position" */
+ set backgroundPosition(String value) {
+ setProperty('background-position', value, '');
+ }
+
+ /** Gets the value of "background-position-x" */
+ String get backgroundPositionX =>
+ getPropertyValue('background-position-x');
+
+ /** Sets the value of "background-position-x" */
+ set backgroundPositionX(String value) {
+ setProperty('background-position-x', value, '');
+ }
+
+ /** Gets the value of "background-position-y" */
+ String get backgroundPositionY =>
+ getPropertyValue('background-position-y');
+
+ /** Sets the value of "background-position-y" */
+ set backgroundPositionY(String value) {
+ setProperty('background-position-y', value, '');
+ }
+
+ /** Gets the value of "background-repeat" */
+ String get backgroundRepeat =>
+ getPropertyValue('background-repeat');
+
+ /** Sets the value of "background-repeat" */
+ set backgroundRepeat(String value) {
+ setProperty('background-repeat', value, '');
+ }
+
+ /** Gets the value of "background-repeat-x" */
+ String get backgroundRepeatX =>
+ getPropertyValue('background-repeat-x');
+
+ /** Sets the value of "background-repeat-x" */
+ set backgroundRepeatX(String value) {
+ setProperty('background-repeat-x', value, '');
+ }
+
+ /** Gets the value of "background-repeat-y" */
+ String get backgroundRepeatY =>
+ getPropertyValue('background-repeat-y');
+
+ /** Sets the value of "background-repeat-y" */
+ set backgroundRepeatY(String value) {
+ setProperty('background-repeat-y', value, '');
+ }
+
+ /** Gets the value of "background-size" */
+ String get backgroundSize =>
+ getPropertyValue('background-size');
+
+ /** Sets the value of "background-size" */
+ set backgroundSize(String value) {
+ setProperty('background-size', value, '');
+ }
+
+ /** Gets the value of "border" */
+ String get border =>
+ getPropertyValue('border');
+
+ /** Sets the value of "border" */
+ set border(String value) {
+ setProperty('border', value, '');
+ }
+
+ /** Gets the value of "border-after" */
+ String get borderAfter =>
+ getPropertyValue('border-after');
+
+ /** Sets the value of "border-after" */
+ set borderAfter(String value) {
+ setProperty('border-after', value, '');
+ }
+
+ /** Gets the value of "border-after-color" */
+ String get borderAfterColor =>
+ getPropertyValue('border-after-color');
+
+ /** Sets the value of "border-after-color" */
+ set borderAfterColor(String value) {
+ setProperty('border-after-color', value, '');
+ }
+
+ /** Gets the value of "border-after-style" */
+ String get borderAfterStyle =>
+ getPropertyValue('border-after-style');
+
+ /** Sets the value of "border-after-style" */
+ set borderAfterStyle(String value) {
+ setProperty('border-after-style', value, '');
+ }
+
+ /** Gets the value of "border-after-width" */
+ String get borderAfterWidth =>
+ getPropertyValue('border-after-width');
+
+ /** Sets the value of "border-after-width" */
+ set borderAfterWidth(String value) {
+ setProperty('border-after-width', value, '');
+ }
+
+ /** Gets the value of "border-before" */
+ String get borderBefore =>
+ getPropertyValue('border-before');
+
+ /** Sets the value of "border-before" */
+ set borderBefore(String value) {
+ setProperty('border-before', value, '');
+ }
+
+ /** Gets the value of "border-before-color" */
+ String get borderBeforeColor =>
+ getPropertyValue('border-before-color');
+
+ /** Sets the value of "border-before-color" */
+ set borderBeforeColor(String value) {
+ setProperty('border-before-color', value, '');
+ }
+
+ /** Gets the value of "border-before-style" */
+ String get borderBeforeStyle =>
+ getPropertyValue('border-before-style');
+
+ /** Sets the value of "border-before-style" */
+ set borderBeforeStyle(String value) {
+ setProperty('border-before-style', value, '');
+ }
+
+ /** Gets the value of "border-before-width" */
+ String get borderBeforeWidth =>
+ getPropertyValue('border-before-width');
+
+ /** Sets the value of "border-before-width" */
+ set borderBeforeWidth(String value) {
+ setProperty('border-before-width', value, '');
+ }
+
+ /** Gets the value of "border-bottom" */
+ String get borderBottom =>
+ getPropertyValue('border-bottom');
+
+ /** Sets the value of "border-bottom" */
+ set borderBottom(String value) {
+ setProperty('border-bottom', value, '');
+ }
+
+ /** Gets the value of "border-bottom-color" */
+ String get borderBottomColor =>
+ getPropertyValue('border-bottom-color');
+
+ /** Sets the value of "border-bottom-color" */
+ set borderBottomColor(String value) {
+ setProperty('border-bottom-color', value, '');
+ }
+
+ /** Gets the value of "border-bottom-left-radius" */
+ String get borderBottomLeftRadius =>
+ getPropertyValue('border-bottom-left-radius');
+
+ /** Sets the value of "border-bottom-left-radius" */
+ set borderBottomLeftRadius(String value) {
+ setProperty('border-bottom-left-radius', value, '');
+ }
+
+ /** Gets the value of "border-bottom-right-radius" */
+ String get borderBottomRightRadius =>
+ getPropertyValue('border-bottom-right-radius');
+
+ /** Sets the value of "border-bottom-right-radius" */
+ set borderBottomRightRadius(String value) {
+ setProperty('border-bottom-right-radius', value, '');
+ }
+
+ /** Gets the value of "border-bottom-style" */
+ String get borderBottomStyle =>
+ getPropertyValue('border-bottom-style');
+
+ /** Sets the value of "border-bottom-style" */
+ set borderBottomStyle(String value) {
+ setProperty('border-bottom-style', value, '');
+ }
+
+ /** Gets the value of "border-bottom-width" */
+ String get borderBottomWidth =>
+ getPropertyValue('border-bottom-width');
+
+ /** Sets the value of "border-bottom-width" */
+ set borderBottomWidth(String value) {
+ setProperty('border-bottom-width', value, '');
+ }
+
+ /** Gets the value of "border-collapse" */
+ String get borderCollapse =>
+ getPropertyValue('border-collapse');
+
+ /** Sets the value of "border-collapse" */
+ set borderCollapse(String value) {
+ setProperty('border-collapse', value, '');
+ }
+
+ /** Gets the value of "border-color" */
+ String get borderColor =>
+ getPropertyValue('border-color');
+
+ /** Sets the value of "border-color" */
+ set borderColor(String value) {
+ setProperty('border-color', value, '');
+ }
+
+ /** Gets the value of "border-end" */
+ String get borderEnd =>
+ getPropertyValue('border-end');
+
+ /** Sets the value of "border-end" */
+ set borderEnd(String value) {
+ setProperty('border-end', value, '');
+ }
+
+ /** Gets the value of "border-end-color" */
+ String get borderEndColor =>
+ getPropertyValue('border-end-color');
+
+ /** Sets the value of "border-end-color" */
+ set borderEndColor(String value) {
+ setProperty('border-end-color', value, '');
+ }
+
+ /** Gets the value of "border-end-style" */
+ String get borderEndStyle =>
+ getPropertyValue('border-end-style');
+
+ /** Sets the value of "border-end-style" */
+ set borderEndStyle(String value) {
+ setProperty('border-end-style', value, '');
+ }
+
+ /** Gets the value of "border-end-width" */
+ String get borderEndWidth =>
+ getPropertyValue('border-end-width');
+
+ /** Sets the value of "border-end-width" */
+ set borderEndWidth(String value) {
+ setProperty('border-end-width', value, '');
+ }
+
+ /** Gets the value of "border-fit" */
+ String get borderFit =>
+ getPropertyValue('border-fit');
+
+ /** Sets the value of "border-fit" */
+ set borderFit(String value) {
+ setProperty('border-fit', value, '');
+ }
+
+ /** Gets the value of "border-horizontal-spacing" */
+ String get borderHorizontalSpacing =>
+ getPropertyValue('border-horizontal-spacing');
+
+ /** Sets the value of "border-horizontal-spacing" */
+ set borderHorizontalSpacing(String value) {
+ setProperty('border-horizontal-spacing', value, '');
+ }
+
+ /** Gets the value of "border-image" */
+ String get borderImage =>
+ getPropertyValue('border-image');
+
+ /** Sets the value of "border-image" */
+ set borderImage(String value) {
+ setProperty('border-image', value, '');
+ }
+
+ /** Gets the value of "border-image-outset" */
+ String get borderImageOutset =>
+ getPropertyValue('border-image-outset');
+
+ /** Sets the value of "border-image-outset" */
+ set borderImageOutset(String value) {
+ setProperty('border-image-outset', value, '');
+ }
+
+ /** Gets the value of "border-image-repeat" */
+ String get borderImageRepeat =>
+ getPropertyValue('border-image-repeat');
+
+ /** Sets the value of "border-image-repeat" */
+ set borderImageRepeat(String value) {
+ setProperty('border-image-repeat', value, '');
+ }
+
+ /** Gets the value of "border-image-slice" */
+ String get borderImageSlice =>
+ getPropertyValue('border-image-slice');
+
+ /** Sets the value of "border-image-slice" */
+ set borderImageSlice(String value) {
+ setProperty('border-image-slice', value, '');
+ }
+
+ /** Gets the value of "border-image-source" */
+ String get borderImageSource =>
+ getPropertyValue('border-image-source');
+
+ /** Sets the value of "border-image-source" */
+ set borderImageSource(String value) {
+ setProperty('border-image-source', value, '');
+ }
+
+ /** Gets the value of "border-image-width" */
+ String get borderImageWidth =>
+ getPropertyValue('border-image-width');
+
+ /** Sets the value of "border-image-width" */
+ set borderImageWidth(String value) {
+ setProperty('border-image-width', value, '');
+ }
+
+ /** Gets the value of "border-left" */
+ String get borderLeft =>
+ getPropertyValue('border-left');
+
+ /** Sets the value of "border-left" */
+ set borderLeft(String value) {
+ setProperty('border-left', value, '');
+ }
+
+ /** Gets the value of "border-left-color" */
+ String get borderLeftColor =>
+ getPropertyValue('border-left-color');
+
+ /** Sets the value of "border-left-color" */
+ set borderLeftColor(String value) {
+ setProperty('border-left-color', value, '');
+ }
+
+ /** Gets the value of "border-left-style" */
+ String get borderLeftStyle =>
+ getPropertyValue('border-left-style');
+
+ /** Sets the value of "border-left-style" */
+ set borderLeftStyle(String value) {
+ setProperty('border-left-style', value, '');
+ }
+
+ /** Gets the value of "border-left-width" */
+ String get borderLeftWidth =>
+ getPropertyValue('border-left-width');
+
+ /** Sets the value of "border-left-width" */
+ set borderLeftWidth(String value) {
+ setProperty('border-left-width', value, '');
+ }
+
+ /** Gets the value of "border-radius" */
+ String get borderRadius =>
+ getPropertyValue('border-radius');
+
+ /** Sets the value of "border-radius" */
+ set borderRadius(String value) {
+ setProperty('border-radius', value, '');
+ }
+
+ /** Gets the value of "border-right" */
+ String get borderRight =>
+ getPropertyValue('border-right');
+
+ /** Sets the value of "border-right" */
+ set borderRight(String value) {
+ setProperty('border-right', value, '');
+ }
+
+ /** Gets the value of "border-right-color" */
+ String get borderRightColor =>
+ getPropertyValue('border-right-color');
+
+ /** Sets the value of "border-right-color" */
+ set borderRightColor(String value) {
+ setProperty('border-right-color', value, '');
+ }
+
+ /** Gets the value of "border-right-style" */
+ String get borderRightStyle =>
+ getPropertyValue('border-right-style');
+
+ /** Sets the value of "border-right-style" */
+ set borderRightStyle(String value) {
+ setProperty('border-right-style', value, '');
+ }
+
+ /** Gets the value of "border-right-width" */
+ String get borderRightWidth =>
+ getPropertyValue('border-right-width');
+
+ /** Sets the value of "border-right-width" */
+ set borderRightWidth(String value) {
+ setProperty('border-right-width', value, '');
+ }
+
+ /** Gets the value of "border-spacing" */
+ String get borderSpacing =>
+ getPropertyValue('border-spacing');
+
+ /** Sets the value of "border-spacing" */
+ set borderSpacing(String value) {
+ setProperty('border-spacing', value, '');
+ }
+
+ /** Gets the value of "border-start" */
+ String get borderStart =>
+ getPropertyValue('border-start');
+
+ /** Sets the value of "border-start" */
+ set borderStart(String value) {
+ setProperty('border-start', value, '');
+ }
+
+ /** Gets the value of "border-start-color" */
+ String get borderStartColor =>
+ getPropertyValue('border-start-color');
+
+ /** Sets the value of "border-start-color" */
+ set borderStartColor(String value) {
+ setProperty('border-start-color', value, '');
+ }
+
+ /** Gets the value of "border-start-style" */
+ String get borderStartStyle =>
+ getPropertyValue('border-start-style');
+
+ /** Sets the value of "border-start-style" */
+ set borderStartStyle(String value) {
+ setProperty('border-start-style', value, '');
+ }
+
+ /** Gets the value of "border-start-width" */
+ String get borderStartWidth =>
+ getPropertyValue('border-start-width');
+
+ /** Sets the value of "border-start-width" */
+ set borderStartWidth(String value) {
+ setProperty('border-start-width', value, '');
+ }
+
+ /** Gets the value of "border-style" */
+ String get borderStyle =>
+ getPropertyValue('border-style');
+
+ /** Sets the value of "border-style" */
+ set borderStyle(String value) {
+ setProperty('border-style', value, '');
+ }
+
+ /** Gets the value of "border-top" */
+ String get borderTop =>
+ getPropertyValue('border-top');
+
+ /** Sets the value of "border-top" */
+ set borderTop(String value) {
+ setProperty('border-top', value, '');
+ }
+
+ /** Gets the value of "border-top-color" */
+ String get borderTopColor =>
+ getPropertyValue('border-top-color');
+
+ /** Sets the value of "border-top-color" */
+ set borderTopColor(String value) {
+ setProperty('border-top-color', value, '');
+ }
+
+ /** Gets the value of "border-top-left-radius" */
+ String get borderTopLeftRadius =>
+ getPropertyValue('border-top-left-radius');
+
+ /** Sets the value of "border-top-left-radius" */
+ set borderTopLeftRadius(String value) {
+ setProperty('border-top-left-radius', value, '');
+ }
+
+ /** Gets the value of "border-top-right-radius" */
+ String get borderTopRightRadius =>
+ getPropertyValue('border-top-right-radius');
+
+ /** Sets the value of "border-top-right-radius" */
+ set borderTopRightRadius(String value) {
+ setProperty('border-top-right-radius', value, '');
+ }
+
+ /** Gets the value of "border-top-style" */
+ String get borderTopStyle =>
+ getPropertyValue('border-top-style');
+
+ /** Sets the value of "border-top-style" */
+ set borderTopStyle(String value) {
+ setProperty('border-top-style', value, '');
+ }
+
+ /** Gets the value of "border-top-width" */
+ String get borderTopWidth =>
+ getPropertyValue('border-top-width');
+
+ /** Sets the value of "border-top-width" */
+ set borderTopWidth(String value) {
+ setProperty('border-top-width', value, '');
+ }
+
+ /** Gets the value of "border-vertical-spacing" */
+ String get borderVerticalSpacing =>
+ getPropertyValue('border-vertical-spacing');
+
+ /** Sets the value of "border-vertical-spacing" */
+ set borderVerticalSpacing(String value) {
+ setProperty('border-vertical-spacing', value, '');
+ }
+
+ /** Gets the value of "border-width" */
+ String get borderWidth =>
+ getPropertyValue('border-width');
+
+ /** Sets the value of "border-width" */
+ set borderWidth(String value) {
+ setProperty('border-width', value, '');
+ }
+
+ /** Gets the value of "bottom" */
+ String get bottom =>
+ getPropertyValue('bottom');
+
+ /** Sets the value of "bottom" */
+ set bottom(String value) {
+ setProperty('bottom', value, '');
+ }
+
+ /** Gets the value of "box-align" */
+ String get boxAlign =>
+ getPropertyValue('box-align');
+
+ /** Sets the value of "box-align" */
+ set boxAlign(String value) {
+ setProperty('box-align', value, '');
+ }
+
+ /** Gets the value of "box-decoration-break" */
+ String get boxDecorationBreak =>
+ getPropertyValue('box-decoration-break');
+
+ /** Sets the value of "box-decoration-break" */
+ set boxDecorationBreak(String value) {
+ setProperty('box-decoration-break', value, '');
+ }
+
+ /** Gets the value of "box-direction" */
+ String get boxDirection =>
+ getPropertyValue('box-direction');
+
+ /** Sets the value of "box-direction" */
+ set boxDirection(String value) {
+ setProperty('box-direction', value, '');
+ }
+
+ /** Gets the value of "box-flex" */
+ String get boxFlex =>
+ getPropertyValue('box-flex');
+
+ /** Sets the value of "box-flex" */
+ set boxFlex(String value) {
+ setProperty('box-flex', value, '');
+ }
+
+ /** Gets the value of "box-flex-group" */
+ String get boxFlexGroup =>
+ getPropertyValue('box-flex-group');
+
+ /** Sets the value of "box-flex-group" */
+ set boxFlexGroup(String value) {
+ setProperty('box-flex-group', value, '');
+ }
+
+ /** Gets the value of "box-lines" */
+ String get boxLines =>
+ getPropertyValue('box-lines');
+
+ /** Sets the value of "box-lines" */
+ set boxLines(String value) {
+ setProperty('box-lines', value, '');
+ }
+
+ /** Gets the value of "box-ordinal-group" */
+ String get boxOrdinalGroup =>
+ getPropertyValue('box-ordinal-group');
+
+ /** Sets the value of "box-ordinal-group" */
+ set boxOrdinalGroup(String value) {
+ setProperty('box-ordinal-group', value, '');
+ }
+
+ /** Gets the value of "box-orient" */
+ String get boxOrient =>
+ getPropertyValue('box-orient');
+
+ /** Sets the value of "box-orient" */
+ set boxOrient(String value) {
+ setProperty('box-orient', value, '');
+ }
+
+ /** Gets the value of "box-pack" */
+ String get boxPack =>
+ getPropertyValue('box-pack');
+
+ /** Sets the value of "box-pack" */
+ set boxPack(String value) {
+ setProperty('box-pack', value, '');
+ }
+
+ /** Gets the value of "box-reflect" */
+ String get boxReflect =>
+ getPropertyValue('box-reflect');
+
+ /** Sets the value of "box-reflect" */
+ set boxReflect(String value) {
+ setProperty('box-reflect', value, '');
+ }
+
+ /** Gets the value of "box-shadow" */
+ String get boxShadow =>
+ getPropertyValue('box-shadow');
+
+ /** Sets the value of "box-shadow" */
+ set boxShadow(String value) {
+ setProperty('box-shadow', value, '');
+ }
+
+ /** Gets the value of "box-sizing" */
+ String get boxSizing =>
+ getPropertyValue('box-sizing');
+
+ /** Sets the value of "box-sizing" */
+ set boxSizing(String value) {
+ setProperty('box-sizing', value, '');
+ }
+
+ /** Gets the value of "caption-side" */
+ String get captionSide =>
+ getPropertyValue('caption-side');
+
+ /** Sets the value of "caption-side" */
+ set captionSide(String value) {
+ setProperty('caption-side', value, '');
+ }
+
+ /** Gets the value of "clear" */
+ String get clear =>
+ getPropertyValue('clear');
+
+ /** Sets the value of "clear" */
+ set clear(String value) {
+ setProperty('clear', value, '');
+ }
+
+ /** Gets the value of "clip" */
+ String get clip =>
+ getPropertyValue('clip');
+
+ /** Sets the value of "clip" */
+ set clip(String value) {
+ setProperty('clip', value, '');
+ }
+
+ /** Gets the value of "clip-path" */
+ String get clipPath =>
+ getPropertyValue('clip-path');
+
+ /** Sets the value of "clip-path" */
+ set clipPath(String value) {
+ setProperty('clip-path', value, '');
+ }
+
+ /** Gets the value of "color" */
+ String get color =>
+ getPropertyValue('color');
+
+ /** Sets the value of "color" */
+ set color(String value) {
+ setProperty('color', value, '');
+ }
+
+ /** Gets the value of "column-break-after" */
+ String get columnBreakAfter =>
+ getPropertyValue('column-break-after');
+
+ /** Sets the value of "column-break-after" */
+ set columnBreakAfter(String value) {
+ setProperty('column-break-after', value, '');
+ }
+
+ /** Gets the value of "column-break-before" */
+ String get columnBreakBefore =>
+ getPropertyValue('column-break-before');
+
+ /** Sets the value of "column-break-before" */
+ set columnBreakBefore(String value) {
+ setProperty('column-break-before', value, '');
+ }
+
+ /** Gets the value of "column-break-inside" */
+ String get columnBreakInside =>
+ getPropertyValue('column-break-inside');
+
+ /** Sets the value of "column-break-inside" */
+ set columnBreakInside(String value) {
+ setProperty('column-break-inside', value, '');
+ }
+
+ /** Gets the value of "column-count" */
+ String get columnCount =>
+ getPropertyValue('column-count');
+
+ /** Sets the value of "column-count" */
+ set columnCount(String value) {
+ setProperty('column-count', value, '');
+ }
+
+ /** Gets the value of "column-fill" */
+ String get columnFill =>
+ getPropertyValue('column-fill');
+
+ /** Sets the value of "column-fill" */
+ set columnFill(String value) {
+ setProperty('column-fill', value, '');
+ }
+
+ /** Gets the value of "column-gap" */
+ String get columnGap =>
+ getPropertyValue('column-gap');
+
+ /** Sets the value of "column-gap" */
+ set columnGap(String value) {
+ setProperty('column-gap', value, '');
+ }
+
+ /** Gets the value of "column-rule" */
+ String get columnRule =>
+ getPropertyValue('column-rule');
+
+ /** Sets the value of "column-rule" */
+ set columnRule(String value) {
+ setProperty('column-rule', value, '');
+ }
+
+ /** Gets the value of "column-rule-color" */
+ String get columnRuleColor =>
+ getPropertyValue('column-rule-color');
+
+ /** Sets the value of "column-rule-color" */
+ set columnRuleColor(String value) {
+ setProperty('column-rule-color', value, '');
+ }
+
+ /** Gets the value of "column-rule-style" */
+ String get columnRuleStyle =>
+ getPropertyValue('column-rule-style');
+
+ /** Sets the value of "column-rule-style" */
+ set columnRuleStyle(String value) {
+ setProperty('column-rule-style', value, '');
+ }
+
+ /** Gets the value of "column-rule-width" */
+ String get columnRuleWidth =>
+ getPropertyValue('column-rule-width');
+
+ /** Sets the value of "column-rule-width" */
+ set columnRuleWidth(String value) {
+ setProperty('column-rule-width', value, '');
+ }
+
+ /** Gets the value of "column-span" */
+ String get columnSpan =>
+ getPropertyValue('column-span');
+
+ /** Sets the value of "column-span" */
+ set columnSpan(String value) {
+ setProperty('column-span', value, '');
+ }
+
+ /** Gets the value of "column-width" */
+ String get columnWidth =>
+ getPropertyValue('column-width');
+
+ /** Sets the value of "column-width" */
+ set columnWidth(String value) {
+ setProperty('column-width', value, '');
+ }
+
+ /** Gets the value of "columns" */
+ String get columns =>
+ getPropertyValue('columns');
+
+ /** Sets the value of "columns" */
+ set columns(String value) {
+ setProperty('columns', value, '');
+ }
+
+ /** Gets the value of "content" */
+ String get content =>
+ getPropertyValue('content');
+
+ /** Sets the value of "content" */
+ set content(String value) {
+ setProperty('content', value, '');
+ }
+
+ /** Gets the value of "counter-increment" */
+ String get counterIncrement =>
+ getPropertyValue('counter-increment');
+
+ /** Sets the value of "counter-increment" */
+ set counterIncrement(String value) {
+ setProperty('counter-increment', value, '');
+ }
+
+ /** Gets the value of "counter-reset" */
+ String get counterReset =>
+ getPropertyValue('counter-reset');
+
+ /** Sets the value of "counter-reset" */
+ set counterReset(String value) {
+ setProperty('counter-reset', value, '');
+ }
+
+ /** Gets the value of "cursor" */
+ String get cursor =>
+ getPropertyValue('cursor');
+
+ /** Sets the value of "cursor" */
+ set cursor(String value) {
+ setProperty('cursor', value, '');
+ }
+
+ /** Gets the value of "direction" */
+ String get direction =>
+ getPropertyValue('direction');
+
+ /** Sets the value of "direction" */
+ set direction(String value) {
+ setProperty('direction', value, '');
+ }
+
+ /** Gets the value of "display" */
+ String get display =>
+ getPropertyValue('display');
+
+ /** Sets the value of "display" */
+ set display(String value) {
+ setProperty('display', value, '');
+ }
+
+ /** Gets the value of "empty-cells" */
+ String get emptyCells =>
+ getPropertyValue('empty-cells');
+
+ /** Sets the value of "empty-cells" */
+ set emptyCells(String value) {
+ setProperty('empty-cells', value, '');
+ }
+
+ /** Gets the value of "filter" */
+ String get filter =>
+ getPropertyValue('filter');
+
+ /** Sets the value of "filter" */
+ set filter(String value) {
+ setProperty('filter', value, '');
+ }
+
+ /** Gets the value of "flex" */
+ String get flex =>
+ getPropertyValue('flex');
+
+ /** Sets the value of "flex" */
+ set flex(String value) {
+ setProperty('flex', value, '');
+ }
+
+ /** Gets the value of "flex-basis" */
+ String get flexBasis =>
+ getPropertyValue('flex-basis');
+
+ /** Sets the value of "flex-basis" */
+ set flexBasis(String value) {
+ setProperty('flex-basis', value, '');
+ }
+
+ /** Gets the value of "flex-direction" */
+ String get flexDirection =>
+ getPropertyValue('flex-direction');
+
+ /** Sets the value of "flex-direction" */
+ set flexDirection(String value) {
+ setProperty('flex-direction', value, '');
+ }
+
+ /** Gets the value of "flex-flow" */
+ String get flexFlow =>
+ getPropertyValue('flex-flow');
+
+ /** Sets the value of "flex-flow" */
+ set flexFlow(String value) {
+ setProperty('flex-flow', value, '');
+ }
+
+ /** Gets the value of "flex-grow" */
+ String get flexGrow =>
+ getPropertyValue('flex-grow');
+
+ /** Sets the value of "flex-grow" */
+ set flexGrow(String value) {
+ setProperty('flex-grow', value, '');
+ }
+
+ /** Gets the value of "flex-shrink" */
+ String get flexShrink =>
+ getPropertyValue('flex-shrink');
+
+ /** Sets the value of "flex-shrink" */
+ set flexShrink(String value) {
+ setProperty('flex-shrink', value, '');
+ }
+
+ /** Gets the value of "flex-wrap" */
+ String get flexWrap =>
+ getPropertyValue('flex-wrap');
+
+ /** Sets the value of "flex-wrap" */
+ set flexWrap(String value) {
+ setProperty('flex-wrap', value, '');
+ }
+
+ /** Gets the value of "float" */
+ String get float =>
+ getPropertyValue('float');
+
+ /** Sets the value of "float" */
+ set float(String value) {
+ setProperty('float', value, '');
+ }
+
+ /** Gets the value of "font" */
+ String get font =>
+ getPropertyValue('font');
+
+ /** Sets the value of "font" */
+ set font(String value) {
+ setProperty('font', value, '');
+ }
+
+ /** Gets the value of "font-family" */
+ String get fontFamily =>
+ getPropertyValue('font-family');
+
+ /** Sets the value of "font-family" */
+ set fontFamily(String value) {
+ setProperty('font-family', value, '');
+ }
+
+ /** Gets the value of "font-feature-settings" */
+ String get fontFeatureSettings =>
+ getPropertyValue('font-feature-settings');
+
+ /** Sets the value of "font-feature-settings" */
+ set fontFeatureSettings(String value) {
+ setProperty('font-feature-settings', value, '');
+ }
+
+ /** Gets the value of "font-kerning" */
+ String get fontKerning =>
+ getPropertyValue('font-kerning');
+
+ /** Sets the value of "font-kerning" */
+ set fontKerning(String value) {
+ setProperty('font-kerning', value, '');
+ }
+
+ /** Gets the value of "font-size" */
+ String get fontSize =>
+ getPropertyValue('font-size');
+
+ /** Sets the value of "font-size" */
+ set fontSize(String value) {
+ setProperty('font-size', value, '');
+ }
+
+ /** Gets the value of "font-size-delta" */
+ String get fontSizeDelta =>
+ getPropertyValue('font-size-delta');
+
+ /** Sets the value of "font-size-delta" */
+ set fontSizeDelta(String value) {
+ setProperty('font-size-delta', value, '');
+ }
+
+ /** Gets the value of "font-smoothing" */
+ String get fontSmoothing =>
+ getPropertyValue('font-smoothing');
+
+ /** Sets the value of "font-smoothing" */
+ set fontSmoothing(String value) {
+ setProperty('font-smoothing', value, '');
+ }
+
+ /** Gets the value of "font-stretch" */
+ String get fontStretch =>
+ getPropertyValue('font-stretch');
+
+ /** Sets the value of "font-stretch" */
+ set fontStretch(String value) {
+ setProperty('font-stretch', value, '');
+ }
+
+ /** Gets the value of "font-style" */
+ String get fontStyle =>
+ getPropertyValue('font-style');
+
+ /** Sets the value of "font-style" */
+ set fontStyle(String value) {
+ setProperty('font-style', value, '');
+ }
+
+ /** Gets the value of "font-variant" */
+ String get fontVariant =>
+ getPropertyValue('font-variant');
+
+ /** Sets the value of "font-variant" */
+ set fontVariant(String value) {
+ setProperty('font-variant', value, '');
+ }
+
+ /** Gets the value of "font-variant-ligatures" */
+ String get fontVariantLigatures =>
+ getPropertyValue('font-variant-ligatures');
+
+ /** Sets the value of "font-variant-ligatures" */
+ set fontVariantLigatures(String value) {
+ setProperty('font-variant-ligatures', value, '');
+ }
+
+ /** Gets the value of "font-weight" */
+ String get fontWeight =>
+ getPropertyValue('font-weight');
+
+ /** Sets the value of "font-weight" */
+ set fontWeight(String value) {
+ setProperty('font-weight', value, '');
+ }
+
+ /** Gets the value of "grid" */
+ String get grid =>
+ getPropertyValue('grid');
+
+ /** Sets the value of "grid" */
+ set grid(String value) {
+ setProperty('grid', value, '');
+ }
+
+ /** Gets the value of "grid-area" */
+ String get gridArea =>
+ getPropertyValue('grid-area');
+
+ /** Sets the value of "grid-area" */
+ set gridArea(String value) {
+ setProperty('grid-area', value, '');
+ }
+
+ /** Gets the value of "grid-auto-columns" */
+ String get gridAutoColumns =>
+ getPropertyValue('grid-auto-columns');
+
+ /** Sets the value of "grid-auto-columns" */
+ set gridAutoColumns(String value) {
+ setProperty('grid-auto-columns', value, '');
+ }
+
+ /** Gets the value of "grid-auto-flow" */
+ String get gridAutoFlow =>
+ getPropertyValue('grid-auto-flow');
+
+ /** Sets the value of "grid-auto-flow" */
+ set gridAutoFlow(String value) {
+ setProperty('grid-auto-flow', value, '');
+ }
+
+ /** Gets the value of "grid-auto-rows" */
+ String get gridAutoRows =>
+ getPropertyValue('grid-auto-rows');
+
+ /** Sets the value of "grid-auto-rows" */
+ set gridAutoRows(String value) {
+ setProperty('grid-auto-rows', value, '');
+ }
+
+ /** Gets the value of "grid-column" */
+ String get gridColumn =>
+ getPropertyValue('grid-column');
+
+ /** Sets the value of "grid-column" */
+ set gridColumn(String value) {
+ setProperty('grid-column', value, '');
+ }
+
+ /** Gets the value of "grid-column-end" */
+ String get gridColumnEnd =>
+ getPropertyValue('grid-column-end');
+
+ /** Sets the value of "grid-column-end" */
+ set gridColumnEnd(String value) {
+ setProperty('grid-column-end', value, '');
+ }
+
+ /** Gets the value of "grid-column-start" */
+ String get gridColumnStart =>
+ getPropertyValue('grid-column-start');
+
+ /** Sets the value of "grid-column-start" */
+ set gridColumnStart(String value) {
+ setProperty('grid-column-start', value, '');
+ }
+
+ /** Gets the value of "grid-row" */
+ String get gridRow =>
+ getPropertyValue('grid-row');
+
+ /** Sets the value of "grid-row" */
+ set gridRow(String value) {
+ setProperty('grid-row', value, '');
+ }
+
+ /** Gets the value of "grid-row-end" */
+ String get gridRowEnd =>
+ getPropertyValue('grid-row-end');
+
+ /** Sets the value of "grid-row-end" */
+ set gridRowEnd(String value) {
+ setProperty('grid-row-end', value, '');
+ }
+
+ /** Gets the value of "grid-row-start" */
+ String get gridRowStart =>
+ getPropertyValue('grid-row-start');
+
+ /** Sets the value of "grid-row-start" */
+ set gridRowStart(String value) {
+ setProperty('grid-row-start', value, '');
+ }
+
+ /** Gets the value of "grid-template" */
+ String get gridTemplate =>
+ getPropertyValue('grid-template');
+
+ /** Sets the value of "grid-template" */
+ set gridTemplate(String value) {
+ setProperty('grid-template', value, '');
+ }
+
+ /** Gets the value of "grid-template-areas" */
+ String get gridTemplateAreas =>
+ getPropertyValue('grid-template-areas');
+
+ /** Sets the value of "grid-template-areas" */
+ set gridTemplateAreas(String value) {
+ setProperty('grid-template-areas', value, '');
+ }
+
+ /** Gets the value of "grid-template-columns" */
+ String get gridTemplateColumns =>
+ getPropertyValue('grid-template-columns');
+
+ /** Sets the value of "grid-template-columns" */
+ set gridTemplateColumns(String value) {
+ setProperty('grid-template-columns', value, '');
+ }
+
+ /** Gets the value of "grid-template-rows" */
+ String get gridTemplateRows =>
+ getPropertyValue('grid-template-rows');
+
+ /** Sets the value of "grid-template-rows" */
+ set gridTemplateRows(String value) {
+ setProperty('grid-template-rows', value, '');
+ }
+
+ /** Gets the value of "height" */
+ String get height =>
+ getPropertyValue('height');
+
+ /** Sets the value of "height" */
+ set height(String value) {
+ setProperty('height', value, '');
+ }
+
+ /** Gets the value of "highlight" */
+ String get highlight =>
+ getPropertyValue('highlight');
+
+ /** Sets the value of "highlight" */
+ set highlight(String value) {
+ setProperty('highlight', value, '');
+ }
+
+ /** Gets the value of "hyphenate-character" */
+ String get hyphenateCharacter =>
+ getPropertyValue('hyphenate-character');
+
+ /** Sets the value of "hyphenate-character" */
+ set hyphenateCharacter(String value) {
+ setProperty('hyphenate-character', value, '');
+ }
+
+ /** Gets the value of "image-rendering" */
+ String get imageRendering =>
+ getPropertyValue('image-rendering');
+
+ /** Sets the value of "image-rendering" */
+ set imageRendering(String value) {
+ setProperty('image-rendering', value, '');
+ }
+
+ /** Gets the value of "isolation" */
+ String get isolation =>
+ getPropertyValue('isolation');
+
+ /** Sets the value of "isolation" */
+ set isolation(String value) {
+ setProperty('isolation', value, '');
+ }
+
+ /** Gets the value of "justify-content" */
+ String get justifyContent =>
+ getPropertyValue('justify-content');
+
+ /** Sets the value of "justify-content" */
+ set justifyContent(String value) {
+ setProperty('justify-content', value, '');
+ }
+
+ /** Gets the value of "justify-self" */
+ String get justifySelf =>
+ getPropertyValue('justify-self');
+
+ /** Sets the value of "justify-self" */
+ set justifySelf(String value) {
+ setProperty('justify-self', value, '');
+ }
+
+ /** Gets the value of "left" */
+ String get left =>
+ getPropertyValue('left');
+
+ /** Sets the value of "left" */
+ set left(String value) {
+ setProperty('left', value, '');
+ }
+
+ /** Gets the value of "letter-spacing" */
+ String get letterSpacing =>
+ getPropertyValue('letter-spacing');
+
+ /** Sets the value of "letter-spacing" */
+ set letterSpacing(String value) {
+ setProperty('letter-spacing', value, '');
+ }
+
+ /** Gets the value of "line-box-contain" */
+ String get lineBoxContain =>
+ getPropertyValue('line-box-contain');
+
+ /** Sets the value of "line-box-contain" */
+ set lineBoxContain(String value) {
+ setProperty('line-box-contain', value, '');
+ }
+
+ /** Gets the value of "line-break" */
+ String get lineBreak =>
+ getPropertyValue('line-break');
+
+ /** Sets the value of "line-break" */
+ set lineBreak(String value) {
+ setProperty('line-break', value, '');
+ }
+
+ /** Gets the value of "line-clamp" */
+ String get lineClamp =>
+ getPropertyValue('line-clamp');
+
+ /** Sets the value of "line-clamp" */
+ set lineClamp(String value) {
+ setProperty('line-clamp', value, '');
+ }
+
+ /** Gets the value of "line-height" */
+ String get lineHeight =>
+ getPropertyValue('line-height');
+
+ /** Sets the value of "line-height" */
+ set lineHeight(String value) {
+ setProperty('line-height', value, '');
+ }
+
+ /** Gets the value of "list-style" */
+ String get listStyle =>
+ getPropertyValue('list-style');
+
+ /** Sets the value of "list-style" */
+ set listStyle(String value) {
+ setProperty('list-style', value, '');
+ }
+
+ /** Gets the value of "list-style-image" */
+ String get listStyleImage =>
+ getPropertyValue('list-style-image');
+
+ /** Sets the value of "list-style-image" */
+ set listStyleImage(String value) {
+ setProperty('list-style-image', value, '');
+ }
+
+ /** Gets the value of "list-style-position" */
+ String get listStylePosition =>
+ getPropertyValue('list-style-position');
+
+ /** Sets the value of "list-style-position" */
+ set listStylePosition(String value) {
+ setProperty('list-style-position', value, '');
+ }
+
+ /** Gets the value of "list-style-type" */
+ String get listStyleType =>
+ getPropertyValue('list-style-type');
+
+ /** Sets the value of "list-style-type" */
+ set listStyleType(String value) {
+ setProperty('list-style-type', value, '');
+ }
+
+ /** Gets the value of "locale" */
+ String get locale =>
+ getPropertyValue('locale');
+
+ /** Sets the value of "locale" */
+ set locale(String value) {
+ setProperty('locale', value, '');
+ }
+
+ /** Gets the value of "logical-height" */
+ String get logicalHeight =>
+ getPropertyValue('logical-height');
+
+ /** Sets the value of "logical-height" */
+ set logicalHeight(String value) {
+ setProperty('logical-height', value, '');
+ }
+
+ /** Gets the value of "logical-width" */
+ String get logicalWidth =>
+ getPropertyValue('logical-width');
+
+ /** Sets the value of "logical-width" */
+ set logicalWidth(String value) {
+ setProperty('logical-width', value, '');
+ }
+
+ /** Gets the value of "margin" */
+ String get margin =>
+ getPropertyValue('margin');
+
+ /** Sets the value of "margin" */
+ set margin(String value) {
+ setProperty('margin', value, '');
+ }
+
+ /** Gets the value of "margin-after" */
+ String get marginAfter =>
+ getPropertyValue('margin-after');
+
+ /** Sets the value of "margin-after" */
+ set marginAfter(String value) {
+ setProperty('margin-after', value, '');
+ }
+
+ /** Gets the value of "margin-after-collapse" */
+ String get marginAfterCollapse =>
+ getPropertyValue('margin-after-collapse');
+
+ /** Sets the value of "margin-after-collapse" */
+ set marginAfterCollapse(String value) {
+ setProperty('margin-after-collapse', value, '');
+ }
+
+ /** Gets the value of "margin-before" */
+ String get marginBefore =>
+ getPropertyValue('margin-before');
+
+ /** Sets the value of "margin-before" */
+ set marginBefore(String value) {
+ setProperty('margin-before', value, '');
+ }
+
+ /** Gets the value of "margin-before-collapse" */
+ String get marginBeforeCollapse =>
+ getPropertyValue('margin-before-collapse');
+
+ /** Sets the value of "margin-before-collapse" */
+ set marginBeforeCollapse(String value) {
+ setProperty('margin-before-collapse', value, '');
+ }
+
+ /** Gets the value of "margin-bottom" */
+ String get marginBottom =>
+ getPropertyValue('margin-bottom');
+
+ /** Sets the value of "margin-bottom" */
+ set marginBottom(String value) {
+ setProperty('margin-bottom', value, '');
+ }
+
+ /** Gets the value of "margin-bottom-collapse" */
+ String get marginBottomCollapse =>
+ getPropertyValue('margin-bottom-collapse');
+
+ /** Sets the value of "margin-bottom-collapse" */
+ set marginBottomCollapse(String value) {
+ setProperty('margin-bottom-collapse', value, '');
+ }
+
+ /** Gets the value of "margin-collapse" */
+ String get marginCollapse =>
+ getPropertyValue('margin-collapse');
+
+ /** Sets the value of "margin-collapse" */
+ set marginCollapse(String value) {
+ setProperty('margin-collapse', value, '');
+ }
+
+ /** Gets the value of "margin-end" */
+ String get marginEnd =>
+ getPropertyValue('margin-end');
+
+ /** Sets the value of "margin-end" */
+ set marginEnd(String value) {
+ setProperty('margin-end', value, '');
+ }
+
+ /** Gets the value of "margin-left" */
+ String get marginLeft =>
+ getPropertyValue('margin-left');
+
+ /** Sets the value of "margin-left" */
+ set marginLeft(String value) {
+ setProperty('margin-left', value, '');
+ }
+
+ /** Gets the value of "margin-right" */
+ String get marginRight =>
+ getPropertyValue('margin-right');
+
+ /** Sets the value of "margin-right" */
+ set marginRight(String value) {
+ setProperty('margin-right', value, '');
+ }
+
+ /** Gets the value of "margin-start" */
+ String get marginStart =>
+ getPropertyValue('margin-start');
+
+ /** Sets the value of "margin-start" */
+ set marginStart(String value) {
+ setProperty('margin-start', value, '');
+ }
+
+ /** Gets the value of "margin-top" */
+ String get marginTop =>
+ getPropertyValue('margin-top');
+
+ /** Sets the value of "margin-top" */
+ set marginTop(String value) {
+ setProperty('margin-top', value, '');
+ }
+
+ /** Gets the value of "margin-top-collapse" */
+ String get marginTopCollapse =>
+ getPropertyValue('margin-top-collapse');
+
+ /** Sets the value of "margin-top-collapse" */
+ set marginTopCollapse(String value) {
+ setProperty('margin-top-collapse', value, '');
+ }
+
+ /** Gets the value of "mask" */
+ String get mask =>
+ getPropertyValue('mask');
+
+ /** Sets the value of "mask" */
+ set mask(String value) {
+ setProperty('mask', value, '');
+ }
+
+ /** Gets the value of "mask-box-image" */
+ String get maskBoxImage =>
+ getPropertyValue('mask-box-image');
+
+ /** Sets the value of "mask-box-image" */
+ set maskBoxImage(String value) {
+ setProperty('mask-box-image', value, '');
+ }
+
+ /** Gets the value of "mask-box-image-outset" */
+ String get maskBoxImageOutset =>
+ getPropertyValue('mask-box-image-outset');
+
+ /** Sets the value of "mask-box-image-outset" */
+ set maskBoxImageOutset(String value) {
+ setProperty('mask-box-image-outset', value, '');
+ }
+
+ /** Gets the value of "mask-box-image-repeat" */
+ String get maskBoxImageRepeat =>
+ getPropertyValue('mask-box-image-repeat');
+
+ /** Sets the value of "mask-box-image-repeat" */
+ set maskBoxImageRepeat(String value) {
+ setProperty('mask-box-image-repeat', value, '');
+ }
+
+ /** Gets the value of "mask-box-image-slice" */
+ String get maskBoxImageSlice =>
+ getPropertyValue('mask-box-image-slice');
+
+ /** Sets the value of "mask-box-image-slice" */
+ set maskBoxImageSlice(String value) {
+ setProperty('mask-box-image-slice', value, '');
+ }
+
+ /** Gets the value of "mask-box-image-source" */
+ String get maskBoxImageSource =>
+ getPropertyValue('mask-box-image-source');
+
+ /** Sets the value of "mask-box-image-source" */
+ set maskBoxImageSource(String value) {
+ setProperty('mask-box-image-source', value, '');
+ }
+
+ /** Gets the value of "mask-box-image-width" */
+ String get maskBoxImageWidth =>
+ getPropertyValue('mask-box-image-width');
+
+ /** Sets the value of "mask-box-image-width" */
+ set maskBoxImageWidth(String value) {
+ setProperty('mask-box-image-width', value, '');
+ }
+
+ /** Gets the value of "mask-clip" */
+ String get maskClip =>
+ getPropertyValue('mask-clip');
+
+ /** Sets the value of "mask-clip" */
+ set maskClip(String value) {
+ setProperty('mask-clip', value, '');
+ }
+
+ /** Gets the value of "mask-composite" */
+ String get maskComposite =>
+ getPropertyValue('mask-composite');
+
+ /** Sets the value of "mask-composite" */
+ set maskComposite(String value) {
+ setProperty('mask-composite', value, '');
+ }
+
+ /** Gets the value of "mask-image" */
+ String get maskImage =>
+ getPropertyValue('mask-image');
+
+ /** Sets the value of "mask-image" */
+ set maskImage(String value) {
+ setProperty('mask-image', value, '');
+ }
+
+ /** Gets the value of "mask-origin" */
+ String get maskOrigin =>
+ getPropertyValue('mask-origin');
+
+ /** Sets the value of "mask-origin" */
+ set maskOrigin(String value) {
+ setProperty('mask-origin', value, '');
+ }
+
+ /** Gets the value of "mask-position" */
+ String get maskPosition =>
+ getPropertyValue('mask-position');
+
+ /** Sets the value of "mask-position" */
+ set maskPosition(String value) {
+ setProperty('mask-position', value, '');
+ }
+
+ /** Gets the value of "mask-position-x" */
+ String get maskPositionX =>
+ getPropertyValue('mask-position-x');
+
+ /** Sets the value of "mask-position-x" */
+ set maskPositionX(String value) {
+ setProperty('mask-position-x', value, '');
+ }
+
+ /** Gets the value of "mask-position-y" */
+ String get maskPositionY =>
+ getPropertyValue('mask-position-y');
+
+ /** Sets the value of "mask-position-y" */
+ set maskPositionY(String value) {
+ setProperty('mask-position-y', value, '');
+ }
+
+ /** Gets the value of "mask-repeat" */
+ String get maskRepeat =>
+ getPropertyValue('mask-repeat');
+
+ /** Sets the value of "mask-repeat" */
+ set maskRepeat(String value) {
+ setProperty('mask-repeat', value, '');
+ }
+
+ /** Gets the value of "mask-repeat-x" */
+ String get maskRepeatX =>
+ getPropertyValue('mask-repeat-x');
+
+ /** Sets the value of "mask-repeat-x" */
+ set maskRepeatX(String value) {
+ setProperty('mask-repeat-x', value, '');
+ }
+
+ /** Gets the value of "mask-repeat-y" */
+ String get maskRepeatY =>
+ getPropertyValue('mask-repeat-y');
+
+ /** Sets the value of "mask-repeat-y" */
+ set maskRepeatY(String value) {
+ setProperty('mask-repeat-y', value, '');
+ }
+
+ /** Gets the value of "mask-size" */
+ String get maskSize =>
+ getPropertyValue('mask-size');
+
+ /** Sets the value of "mask-size" */
+ set maskSize(String value) {
+ setProperty('mask-size', value, '');
+ }
+
+ /** Gets the value of "mask-source-type" */
+ String get maskSourceType =>
+ getPropertyValue('mask-source-type');
+
+ /** Sets the value of "mask-source-type" */
+ set maskSourceType(String value) {
+ setProperty('mask-source-type', value, '');
+ }
+
+ /** Gets the value of "max-height" */
+ String get maxHeight =>
+ getPropertyValue('max-height');
+
+ /** Sets the value of "max-height" */
+ set maxHeight(String value) {
+ setProperty('max-height', value, '');
+ }
+
+ /** Gets the value of "max-logical-height" */
+ String get maxLogicalHeight =>
+ getPropertyValue('max-logical-height');
+
+ /** Sets the value of "max-logical-height" */
+ set maxLogicalHeight(String value) {
+ setProperty('max-logical-height', value, '');
+ }
+
+ /** Gets the value of "max-logical-width" */
+ String get maxLogicalWidth =>
+ getPropertyValue('max-logical-width');
+
+ /** Sets the value of "max-logical-width" */
+ set maxLogicalWidth(String value) {
+ setProperty('max-logical-width', value, '');
+ }
+
+ /** Gets the value of "max-width" */
+ String get maxWidth =>
+ getPropertyValue('max-width');
+
+ /** Sets the value of "max-width" */
+ set maxWidth(String value) {
+ setProperty('max-width', value, '');
+ }
+
+ /** Gets the value of "max-zoom" */
+ String get maxZoom =>
+ getPropertyValue('max-zoom');
+
+ /** Sets the value of "max-zoom" */
+ set maxZoom(String value) {
+ setProperty('max-zoom', value, '');
+ }
+
+ /** Gets the value of "min-height" */
+ String get minHeight =>
+ getPropertyValue('min-height');
+
+ /** Sets the value of "min-height" */
+ set minHeight(String value) {
+ setProperty('min-height', value, '');
+ }
+
+ /** Gets the value of "min-logical-height" */
+ String get minLogicalHeight =>
+ getPropertyValue('min-logical-height');
+
+ /** Sets the value of "min-logical-height" */
+ set minLogicalHeight(String value) {
+ setProperty('min-logical-height', value, '');
+ }
+
+ /** Gets the value of "min-logical-width" */
+ String get minLogicalWidth =>
+ getPropertyValue('min-logical-width');
+
+ /** Sets the value of "min-logical-width" */
+ set minLogicalWidth(String value) {
+ setProperty('min-logical-width', value, '');
+ }
+
+ /** Gets the value of "min-width" */
+ String get minWidth =>
+ getPropertyValue('min-width');
+
+ /** Sets the value of "min-width" */
+ set minWidth(String value) {
+ setProperty('min-width', value, '');
+ }
+
+ /** Gets the value of "min-zoom" */
+ String get minZoom =>
+ getPropertyValue('min-zoom');
+
+ /** Sets the value of "min-zoom" */
+ set minZoom(String value) {
+ setProperty('min-zoom', value, '');
+ }
+
+ /** Gets the value of "mix-blend-mode" */
+ String get mixBlendMode =>
+ getPropertyValue('mix-blend-mode');
+
+ /** Sets the value of "mix-blend-mode" */
+ set mixBlendMode(String value) {
+ setProperty('mix-blend-mode', value, '');
+ }
+
+ /** Gets the value of "object-fit" */
+ String get objectFit =>
+ getPropertyValue('object-fit');
+
+ /** Sets the value of "object-fit" */
+ set objectFit(String value) {
+ setProperty('object-fit', value, '');
+ }
+
+ /** Gets the value of "object-position" */
+ String get objectPosition =>
+ getPropertyValue('object-position');
+
+ /** Sets the value of "object-position" */
+ set objectPosition(String value) {
+ setProperty('object-position', value, '');
+ }
+
+ /** Gets the value of "opacity" */
+ String get opacity =>
+ getPropertyValue('opacity');
+
+ /** Sets the value of "opacity" */
+ set opacity(String value) {
+ setProperty('opacity', value, '');
+ }
+
+ /** Gets the value of "order" */
+ String get order =>
+ getPropertyValue('order');
+
+ /** Sets the value of "order" */
+ set order(String value) {
+ setProperty('order', value, '');
+ }
+
+ /** Gets the value of "orientation" */
+ String get orientation =>
+ getPropertyValue('orientation');
+
+ /** Sets the value of "orientation" */
+ set orientation(String value) {
+ setProperty('orientation', value, '');
+ }
+
+ /** Gets the value of "orphans" */
+ String get orphans =>
+ getPropertyValue('orphans');
+
+ /** Sets the value of "orphans" */
+ set orphans(String value) {
+ setProperty('orphans', value, '');
+ }
+
+ /** Gets the value of "outline" */
+ String get outline =>
+ getPropertyValue('outline');
+
+ /** Sets the value of "outline" */
+ set outline(String value) {
+ setProperty('outline', value, '');
+ }
+
+ /** Gets the value of "outline-color" */
+ String get outlineColor =>
+ getPropertyValue('outline-color');
+
+ /** Sets the value of "outline-color" */
+ set outlineColor(String value) {
+ setProperty('outline-color', value, '');
+ }
+
+ /** Gets the value of "outline-offset" */
+ String get outlineOffset =>
+ getPropertyValue('outline-offset');
+
+ /** Sets the value of "outline-offset" */
+ set outlineOffset(String value) {
+ setProperty('outline-offset', value, '');
+ }
+
+ /** Gets the value of "outline-style" */
+ String get outlineStyle =>
+ getPropertyValue('outline-style');
+
+ /** Sets the value of "outline-style" */
+ set outlineStyle(String value) {
+ setProperty('outline-style', value, '');
+ }
+
+ /** Gets the value of "outline-width" */
+ String get outlineWidth =>
+ getPropertyValue('outline-width');
+
+ /** Sets the value of "outline-width" */
+ set outlineWidth(String value) {
+ setProperty('outline-width', value, '');
+ }
+
+ /** Gets the value of "overflow" */
+ String get overflow =>
+ getPropertyValue('overflow');
+
+ /** Sets the value of "overflow" */
+ set overflow(String value) {
+ setProperty('overflow', value, '');
+ }
+
+ /** Gets the value of "overflow-wrap" */
+ String get overflowWrap =>
+ getPropertyValue('overflow-wrap');
+
+ /** Sets the value of "overflow-wrap" */
+ set overflowWrap(String value) {
+ setProperty('overflow-wrap', value, '');
+ }
+
+ /** Gets the value of "overflow-x" */
+ String get overflowX =>
+ getPropertyValue('overflow-x');
+
+ /** Sets the value of "overflow-x" */
+ set overflowX(String value) {
+ setProperty('overflow-x', value, '');
+ }
+
+ /** Gets the value of "overflow-y" */
+ String get overflowY =>
+ getPropertyValue('overflow-y');
+
+ /** Sets the value of "overflow-y" */
+ set overflowY(String value) {
+ setProperty('overflow-y', value, '');
+ }
+
+ /** Gets the value of "padding" */
+ String get padding =>
+ getPropertyValue('padding');
+
+ /** Sets the value of "padding" */
+ set padding(String value) {
+ setProperty('padding', value, '');
+ }
+
+ /** Gets the value of "padding-after" */
+ String get paddingAfter =>
+ getPropertyValue('padding-after');
+
+ /** Sets the value of "padding-after" */
+ set paddingAfter(String value) {
+ setProperty('padding-after', value, '');
+ }
+
+ /** Gets the value of "padding-before" */
+ String get paddingBefore =>
+ getPropertyValue('padding-before');
+
+ /** Sets the value of "padding-before" */
+ set paddingBefore(String value) {
+ setProperty('padding-before', value, '');
+ }
+
+ /** Gets the value of "padding-bottom" */
+ String get paddingBottom =>
+ getPropertyValue('padding-bottom');
+
+ /** Sets the value of "padding-bottom" */
+ set paddingBottom(String value) {
+ setProperty('padding-bottom', value, '');
+ }
+
+ /** Gets the value of "padding-end" */
+ String get paddingEnd =>
+ getPropertyValue('padding-end');
+
+ /** Sets the value of "padding-end" */
+ set paddingEnd(String value) {
+ setProperty('padding-end', value, '');
+ }
+
+ /** Gets the value of "padding-left" */
+ String get paddingLeft =>
+ getPropertyValue('padding-left');
+
+ /** Sets the value of "padding-left" */
+ set paddingLeft(String value) {
+ setProperty('padding-left', value, '');
+ }
+
+ /** Gets the value of "padding-right" */
+ String get paddingRight =>
+ getPropertyValue('padding-right');
+
+ /** Sets the value of "padding-right" */
+ set paddingRight(String value) {
+ setProperty('padding-right', value, '');
+ }
+
+ /** Gets the value of "padding-start" */
+ String get paddingStart =>
+ getPropertyValue('padding-start');
+
+ /** Sets the value of "padding-start" */
+ set paddingStart(String value) {
+ setProperty('padding-start', value, '');
+ }
+
+ /** Gets the value of "padding-top" */
+ String get paddingTop =>
+ getPropertyValue('padding-top');
+
+ /** Sets the value of "padding-top" */
+ set paddingTop(String value) {
+ setProperty('padding-top', value, '');
+ }
+
+ /** Gets the value of "page" */
+ String get page =>
+ getPropertyValue('page');
+
+ /** Sets the value of "page" */
+ set page(String value) {
+ setProperty('page', value, '');
+ }
+
+ /** Gets the value of "page-break-after" */
+ String get pageBreakAfter =>
+ getPropertyValue('page-break-after');
+
+ /** Sets the value of "page-break-after" */
+ set pageBreakAfter(String value) {
+ setProperty('page-break-after', value, '');
+ }
+
+ /** Gets the value of "page-break-before" */
+ String get pageBreakBefore =>
+ getPropertyValue('page-break-before');
+
+ /** Sets the value of "page-break-before" */
+ set pageBreakBefore(String value) {
+ setProperty('page-break-before', value, '');
+ }
+
+ /** Gets the value of "page-break-inside" */
+ String get pageBreakInside =>
+ getPropertyValue('page-break-inside');
+
+ /** Sets the value of "page-break-inside" */
+ set pageBreakInside(String value) {
+ setProperty('page-break-inside', value, '');
+ }
+
+ /** Gets the value of "perspective" */
+ String get perspective =>
+ getPropertyValue('perspective');
+
+ /** Sets the value of "perspective" */
+ set perspective(String value) {
+ setProperty('perspective', value, '');
+ }
+
+ /** Gets the value of "perspective-origin" */
+ String get perspectiveOrigin =>
+ getPropertyValue('perspective-origin');
+
+ /** Sets the value of "perspective-origin" */
+ set perspectiveOrigin(String value) {
+ setProperty('perspective-origin', value, '');
+ }
+
+ /** Gets the value of "perspective-origin-x" */
+ String get perspectiveOriginX =>
+ getPropertyValue('perspective-origin-x');
+
+ /** Sets the value of "perspective-origin-x" */
+ set perspectiveOriginX(String value) {
+ setProperty('perspective-origin-x', value, '');
+ }
+
+ /** Gets the value of "perspective-origin-y" */
+ String get perspectiveOriginY =>
+ getPropertyValue('perspective-origin-y');
+
+ /** Sets the value of "perspective-origin-y" */
+ set perspectiveOriginY(String value) {
+ setProperty('perspective-origin-y', value, '');
+ }
+
+ /** Gets the value of "pointer-events" */
+ String get pointerEvents =>
+ getPropertyValue('pointer-events');
+
+ /** Sets the value of "pointer-events" */
+ set pointerEvents(String value) {
+ setProperty('pointer-events', value, '');
+ }
+
+ /** Gets the value of "position" */
+ String get position =>
+ getPropertyValue('position');
+
+ /** Sets the value of "position" */
+ set position(String value) {
+ setProperty('position', value, '');
+ }
+
+ /** Gets the value of "print-color-adjust" */
+ String get printColorAdjust =>
+ getPropertyValue('print-color-adjust');
+
+ /** Sets the value of "print-color-adjust" */
+ set printColorAdjust(String value) {
+ setProperty('print-color-adjust', value, '');
+ }
+
+ /** Gets the value of "quotes" */
+ String get quotes =>
+ getPropertyValue('quotes');
+
+ /** Sets the value of "quotes" */
+ set quotes(String value) {
+ setProperty('quotes', value, '');
+ }
+
+ /** Gets the value of "resize" */
+ String get resize =>
+ getPropertyValue('resize');
+
+ /** Sets the value of "resize" */
+ set resize(String value) {
+ setProperty('resize', value, '');
+ }
+
+ /** Gets the value of "right" */
+ String get right =>
+ getPropertyValue('right');
+
+ /** Sets the value of "right" */
+ set right(String value) {
+ setProperty('right', value, '');
+ }
+
+ /** Gets the value of "rtl-ordering" */
+ String get rtlOrdering =>
+ getPropertyValue('rtl-ordering');
+
+ /** Sets the value of "rtl-ordering" */
+ set rtlOrdering(String value) {
+ setProperty('rtl-ordering', value, '');
+ }
+
+ /** Gets the value of "ruby-position" */
+ String get rubyPosition =>
+ getPropertyValue('ruby-position');
+
+ /** Sets the value of "ruby-position" */
+ set rubyPosition(String value) {
+ setProperty('ruby-position', value, '');
+ }
+
+ /** Gets the value of "scroll-behavior" */
+ String get scrollBehavior =>
+ getPropertyValue('scroll-behavior');
+
+ /** Sets the value of "scroll-behavior" */
+ set scrollBehavior(String value) {
+ setProperty('scroll-behavior', value, '');
+ }
+
+ /** Gets the value of "shape-image-threshold" */
+ String get shapeImageThreshold =>
+ getPropertyValue('shape-image-threshold');
+
+ /** Sets the value of "shape-image-threshold" */
+ set shapeImageThreshold(String value) {
+ setProperty('shape-image-threshold', value, '');
+ }
+
+ /** Gets the value of "shape-margin" */
+ String get shapeMargin =>
+ getPropertyValue('shape-margin');
+
+ /** Sets the value of "shape-margin" */
+ set shapeMargin(String value) {
+ setProperty('shape-margin', value, '');
+ }
+
+ /** Gets the value of "shape-outside" */
+ String get shapeOutside =>
+ getPropertyValue('shape-outside');
+
+ /** Sets the value of "shape-outside" */
+ set shapeOutside(String value) {
+ setProperty('shape-outside', value, '');
+ }
+
+ /** Gets the value of "size" */
+ String get size =>
+ getPropertyValue('size');
+
+ /** Sets the value of "size" */
+ set size(String value) {
+ setProperty('size', value, '');
+ }
+
+ /** Gets the value of "speak" */
+ String get speak =>
+ getPropertyValue('speak');
+
+ /** Sets the value of "speak" */
+ set speak(String value) {
+ setProperty('speak', value, '');
+ }
+
+ /** Gets the value of "src" */
+ String get src =>
+ getPropertyValue('src');
+
+ /** Sets the value of "src" */
+ set src(String value) {
+ setProperty('src', value, '');
+ }
+
+ /** Gets the value of "tab-size" */
+ String get tabSize =>
+ getPropertyValue('tab-size');
+
+ /** Sets the value of "tab-size" */
+ set tabSize(String value) {
+ setProperty('tab-size', value, '');
+ }
+
+ /** Gets the value of "table-layout" */
+ String get tableLayout =>
+ getPropertyValue('table-layout');
+
+ /** Sets the value of "table-layout" */
+ set tableLayout(String value) {
+ setProperty('table-layout', value, '');
+ }
+
+ /** Gets the value of "tap-highlight-color" */
+ String get tapHighlightColor =>
+ getPropertyValue('tap-highlight-color');
+
+ /** Sets the value of "tap-highlight-color" */
+ set tapHighlightColor(String value) {
+ setProperty('tap-highlight-color', value, '');
+ }
+
+ /** Gets the value of "text-align" */
+ String get textAlign =>
+ getPropertyValue('text-align');
+
+ /** Sets the value of "text-align" */
+ set textAlign(String value) {
+ setProperty('text-align', value, '');
+ }
+
+ /** Gets the value of "text-align-last" */
+ String get textAlignLast =>
+ getPropertyValue('text-align-last');
+
+ /** Sets the value of "text-align-last" */
+ set textAlignLast(String value) {
+ setProperty('text-align-last', value, '');
+ }
+
+ /** Gets the value of "text-combine" */
+ String get textCombine =>
+ getPropertyValue('text-combine');
+
+ /** Sets the value of "text-combine" */
+ set textCombine(String value) {
+ setProperty('text-combine', value, '');
+ }
+
+ /** Gets the value of "text-decoration" */
+ String get textDecoration =>
+ getPropertyValue('text-decoration');
+
+ /** Sets the value of "text-decoration" */
+ set textDecoration(String value) {
+ setProperty('text-decoration', value, '');
+ }
+
+ /** Gets the value of "text-decoration-color" */
+ String get textDecorationColor =>
+ getPropertyValue('text-decoration-color');
+
+ /** Sets the value of "text-decoration-color" */
+ set textDecorationColor(String value) {
+ setProperty('text-decoration-color', value, '');
+ }
+
+ /** Gets the value of "text-decoration-line" */
+ String get textDecorationLine =>
+ getPropertyValue('text-decoration-line');
+
+ /** Sets the value of "text-decoration-line" */
+ set textDecorationLine(String value) {
+ setProperty('text-decoration-line', value, '');
+ }
+
+ /** Gets the value of "text-decoration-style" */
+ String get textDecorationStyle =>
+ getPropertyValue('text-decoration-style');
+
+ /** Sets the value of "text-decoration-style" */
+ set textDecorationStyle(String value) {
+ setProperty('text-decoration-style', value, '');
+ }
+
+ /** Gets the value of "text-decorations-in-effect" */
+ String get textDecorationsInEffect =>
+ getPropertyValue('text-decorations-in-effect');
+
+ /** Sets the value of "text-decorations-in-effect" */
+ set textDecorationsInEffect(String value) {
+ setProperty('text-decorations-in-effect', value, '');
+ }
+
+ /** Gets the value of "text-emphasis" */
+ String get textEmphasis =>
+ getPropertyValue('text-emphasis');
+
+ /** Sets the value of "text-emphasis" */
+ set textEmphasis(String value) {
+ setProperty('text-emphasis', value, '');
+ }
+
+ /** Gets the value of "text-emphasis-color" */
+ String get textEmphasisColor =>
+ getPropertyValue('text-emphasis-color');
+
+ /** Sets the value of "text-emphasis-color" */
+ set textEmphasisColor(String value) {
+ setProperty('text-emphasis-color', value, '');
+ }
+
+ /** Gets the value of "text-emphasis-position" */
+ String get textEmphasisPosition =>
+ getPropertyValue('text-emphasis-position');
+
+ /** Sets the value of "text-emphasis-position" */
+ set textEmphasisPosition(String value) {
+ setProperty('text-emphasis-position', value, '');
+ }
+
+ /** Gets the value of "text-emphasis-style" */
+ String get textEmphasisStyle =>
+ getPropertyValue('text-emphasis-style');
+
+ /** Sets the value of "text-emphasis-style" */
+ set textEmphasisStyle(String value) {
+ setProperty('text-emphasis-style', value, '');
+ }
+
+ /** Gets the value of "text-fill-color" */
+ String get textFillColor =>
+ getPropertyValue('text-fill-color');
+
+ /** Sets the value of "text-fill-color" */
+ set textFillColor(String value) {
+ setProperty('text-fill-color', value, '');
+ }
+
+ /** Gets the value of "text-indent" */
+ String get textIndent =>
+ getPropertyValue('text-indent');
+
+ /** Sets the value of "text-indent" */
+ set textIndent(String value) {
+ setProperty('text-indent', value, '');
+ }
+
+ /** Gets the value of "text-justify" */
+ String get textJustify =>
+ getPropertyValue('text-justify');
+
+ /** Sets the value of "text-justify" */
+ set textJustify(String value) {
+ setProperty('text-justify', value, '');
+ }
+
+ /** Gets the value of "text-line-through-color" */
+ String get textLineThroughColor =>
+ getPropertyValue('text-line-through-color');
+
+ /** Sets the value of "text-line-through-color" */
+ set textLineThroughColor(String value) {
+ setProperty('text-line-through-color', value, '');
+ }
+
+ /** Gets the value of "text-line-through-mode" */
+ String get textLineThroughMode =>
+ getPropertyValue('text-line-through-mode');
+
+ /** Sets the value of "text-line-through-mode" */
+ set textLineThroughMode(String value) {
+ setProperty('text-line-through-mode', value, '');
+ }
+
+ /** Gets the value of "text-line-through-style" */
+ String get textLineThroughStyle =>
+ getPropertyValue('text-line-through-style');
+
+ /** Sets the value of "text-line-through-style" */
+ set textLineThroughStyle(String value) {
+ setProperty('text-line-through-style', value, '');
+ }
+
+ /** Gets the value of "text-line-through-width" */
+ String get textLineThroughWidth =>
+ getPropertyValue('text-line-through-width');
+
+ /** Sets the value of "text-line-through-width" */
+ set textLineThroughWidth(String value) {
+ setProperty('text-line-through-width', value, '');
+ }
+
+ /** Gets the value of "text-orientation" */
+ String get textOrientation =>
+ getPropertyValue('text-orientation');
+
+ /** Sets the value of "text-orientation" */
+ set textOrientation(String value) {
+ setProperty('text-orientation', value, '');
+ }
+
+ /** Gets the value of "text-overflow" */
+ String get textOverflow =>
+ getPropertyValue('text-overflow');
+
+ /** Sets the value of "text-overflow" */
+ set textOverflow(String value) {
+ setProperty('text-overflow', value, '');
+ }
+
+ /** Gets the value of "text-overline-color" */
+ String get textOverlineColor =>
+ getPropertyValue('text-overline-color');
+
+ /** Sets the value of "text-overline-color" */
+ set textOverlineColor(String value) {
+ setProperty('text-overline-color', value, '');
+ }
+
+ /** Gets the value of "text-overline-mode" */
+ String get textOverlineMode =>
+ getPropertyValue('text-overline-mode');
+
+ /** Sets the value of "text-overline-mode" */
+ set textOverlineMode(String value) {
+ setProperty('text-overline-mode', value, '');
+ }
+
+ /** Gets the value of "text-overline-style" */
+ String get textOverlineStyle =>
+ getPropertyValue('text-overline-style');
+
+ /** Sets the value of "text-overline-style" */
+ set textOverlineStyle(String value) {
+ setProperty('text-overline-style', value, '');
+ }
+
+ /** Gets the value of "text-overline-width" */
+ String get textOverlineWidth =>
+ getPropertyValue('text-overline-width');
+
+ /** Sets the value of "text-overline-width" */
+ set textOverlineWidth(String value) {
+ setProperty('text-overline-width', value, '');
+ }
+
+ /** Gets the value of "text-rendering" */
+ String get textRendering =>
+ getPropertyValue('text-rendering');
+
+ /** Sets the value of "text-rendering" */
+ set textRendering(String value) {
+ setProperty('text-rendering', value, '');
+ }
+
+ /** Gets the value of "text-security" */
+ String get textSecurity =>
+ getPropertyValue('text-security');
+
+ /** Sets the value of "text-security" */
+ set textSecurity(String value) {
+ setProperty('text-security', value, '');
+ }
+
+ /** Gets the value of "text-shadow" */
+ String get textShadow =>
+ getPropertyValue('text-shadow');
+
+ /** Sets the value of "text-shadow" */
+ set textShadow(String value) {
+ setProperty('text-shadow', value, '');
+ }
+
+ /** Gets the value of "text-stroke" */
+ String get textStroke =>
+ getPropertyValue('text-stroke');
+
+ /** Sets the value of "text-stroke" */
+ set textStroke(String value) {
+ setProperty('text-stroke', value, '');
+ }
+
+ /** Gets the value of "text-stroke-color" */
+ String get textStrokeColor =>
+ getPropertyValue('text-stroke-color');
+
+ /** Sets the value of "text-stroke-color" */
+ set textStrokeColor(String value) {
+ setProperty('text-stroke-color', value, '');
+ }
+
+ /** Gets the value of "text-stroke-width" */
+ String get textStrokeWidth =>
+ getPropertyValue('text-stroke-width');
+
+ /** Sets the value of "text-stroke-width" */
+ set textStrokeWidth(String value) {
+ setProperty('text-stroke-width', value, '');
+ }
+
+ /** Gets the value of "text-transform" */
+ String get textTransform =>
+ getPropertyValue('text-transform');
+
+ /** Sets the value of "text-transform" */
+ set textTransform(String value) {
+ setProperty('text-transform', value, '');
+ }
+
+ /** Gets the value of "text-underline-color" */
+ String get textUnderlineColor =>
+ getPropertyValue('text-underline-color');
+
+ /** Sets the value of "text-underline-color" */
+ set textUnderlineColor(String value) {
+ setProperty('text-underline-color', value, '');
+ }
+
+ /** Gets the value of "text-underline-mode" */
+ String get textUnderlineMode =>
+ getPropertyValue('text-underline-mode');
+
+ /** Sets the value of "text-underline-mode" */
+ set textUnderlineMode(String value) {
+ setProperty('text-underline-mode', value, '');
+ }
+
+ /** Gets the value of "text-underline-position" */
+ String get textUnderlinePosition =>
+ getPropertyValue('text-underline-position');
+
+ /** Sets the value of "text-underline-position" */
+ set textUnderlinePosition(String value) {
+ setProperty('text-underline-position', value, '');
+ }
+
+ /** Gets the value of "text-underline-style" */
+ String get textUnderlineStyle =>
+ getPropertyValue('text-underline-style');
+
+ /** Sets the value of "text-underline-style" */
+ set textUnderlineStyle(String value) {
+ setProperty('text-underline-style', value, '');
+ }
+
+ /** Gets the value of "text-underline-width" */
+ String get textUnderlineWidth =>
+ getPropertyValue('text-underline-width');
+
+ /** Sets the value of "text-underline-width" */
+ set textUnderlineWidth(String value) {
+ setProperty('text-underline-width', value, '');
+ }
+
+ /** Gets the value of "top" */
+ String get top =>
+ getPropertyValue('top');
+
+ /** Sets the value of "top" */
+ set top(String value) {
+ setProperty('top', value, '');
+ }
+
+ /** Gets the value of "touch-action" */
+ String get touchAction =>
+ getPropertyValue('touch-action');
+
+ /** Sets the value of "touch-action" */
+ set touchAction(String value) {
+ setProperty('touch-action', value, '');
+ }
+
+ /** Gets the value of "touch-action-delay" */
+ String get touchActionDelay =>
+ getPropertyValue('touch-action-delay');
+
+ /** Sets the value of "touch-action-delay" */
+ set touchActionDelay(String value) {
+ setProperty('touch-action-delay', value, '');
+ }
+
+ /** Gets the value of "transform" */
+ String get transform =>
+ getPropertyValue('transform');
+
+ /** Sets the value of "transform" */
+ set transform(String value) {
+ setProperty('transform', value, '');
+ }
+
+ /** Gets the value of "transform-origin" */
+ String get transformOrigin =>
+ getPropertyValue('transform-origin');
+
+ /** Sets the value of "transform-origin" */
+ set transformOrigin(String value) {
+ setProperty('transform-origin', value, '');
+ }
+
+ /** Gets the value of "transform-origin-x" */
+ String get transformOriginX =>
+ getPropertyValue('transform-origin-x');
+
+ /** Sets the value of "transform-origin-x" */
+ set transformOriginX(String value) {
+ setProperty('transform-origin-x', value, '');
+ }
+
+ /** Gets the value of "transform-origin-y" */
+ String get transformOriginY =>
+ getPropertyValue('transform-origin-y');
+
+ /** Sets the value of "transform-origin-y" */
+ set transformOriginY(String value) {
+ setProperty('transform-origin-y', value, '');
+ }
+
+ /** Gets the value of "transform-origin-z" */
+ String get transformOriginZ =>
+ getPropertyValue('transform-origin-z');
+
+ /** Sets the value of "transform-origin-z" */
+ set transformOriginZ(String value) {
+ setProperty('transform-origin-z', value, '');
+ }
+
+ /** Gets the value of "transform-style" */
+ String get transformStyle =>
+ getPropertyValue('transform-style');
+
+ /** Sets the value of "transform-style" */
+ set transformStyle(String value) {
+ setProperty('transform-style', value, '');
+ }
+
+ /** Gets the value of "transition" */@SupportedBrowser(SupportedBrowser.CHROME)
+ @SupportedBrowser(SupportedBrowser.FIREFOX)
+ @SupportedBrowser(SupportedBrowser.IE, '10')
+ @SupportedBrowser(SupportedBrowser.SAFARI)
+ String get transition =>
+ getPropertyValue('transition');
+
+ /** Sets the value of "transition" */@SupportedBrowser(SupportedBrowser.CHROME)
+ @SupportedBrowser(SupportedBrowser.FIREFOX)
+ @SupportedBrowser(SupportedBrowser.IE, '10')
+ @SupportedBrowser(SupportedBrowser.SAFARI)
+ set transition(String value) {
+ setProperty('transition', value, '');
+ }
+
+ /** Gets the value of "transition-delay" */
+ String get transitionDelay =>
+ getPropertyValue('transition-delay');
+
+ /** Sets the value of "transition-delay" */
+ set transitionDelay(String value) {
+ setProperty('transition-delay', value, '');
+ }
+
+ /** Gets the value of "transition-duration" */
+ String get transitionDuration =>
+ getPropertyValue('transition-duration');
+
+ /** Sets the value of "transition-duration" */
+ set transitionDuration(String value) {
+ setProperty('transition-duration', value, '');
+ }
+
+ /** Gets the value of "transition-property" */
+ String get transitionProperty =>
+ getPropertyValue('transition-property');
+
+ /** Sets the value of "transition-property" */
+ set transitionProperty(String value) {
+ setProperty('transition-property', value, '');
+ }
+
+ /** Gets the value of "transition-timing-function" */
+ String get transitionTimingFunction =>
+ getPropertyValue('transition-timing-function');
+
+ /** Sets the value of "transition-timing-function" */
+ set transitionTimingFunction(String value) {
+ setProperty('transition-timing-function', value, '');
+ }
+
+ /** Gets the value of "unicode-bidi" */
+ String get unicodeBidi =>
+ getPropertyValue('unicode-bidi');
+
+ /** Sets the value of "unicode-bidi" */
+ set unicodeBidi(String value) {
+ setProperty('unicode-bidi', value, '');
+ }
+
+ /** Gets the value of "unicode-range" */
+ String get unicodeRange =>
+ getPropertyValue('unicode-range');
+
+ /** Sets the value of "unicode-range" */
+ set unicodeRange(String value) {
+ setProperty('unicode-range', value, '');
+ }
+
+ /** Gets the value of "user-drag" */
+ String get userDrag =>
+ getPropertyValue('user-drag');
+
+ /** Sets the value of "user-drag" */
+ set userDrag(String value) {
+ setProperty('user-drag', value, '');
+ }
+
+ /** Gets the value of "user-modify" */
+ String get userModify =>
+ getPropertyValue('user-modify');
+
+ /** Sets the value of "user-modify" */
+ set userModify(String value) {
+ setProperty('user-modify', value, '');
+ }
+
+ /** Gets the value of "user-select" */
+ String get userSelect =>
+ getPropertyValue('user-select');
+
+ /** Sets the value of "user-select" */
+ set userSelect(String value) {
+ setProperty('user-select', value, '');
+ }
+
+ /** Gets the value of "user-zoom" */
+ String get userZoom =>
+ getPropertyValue('user-zoom');
+
+ /** Sets the value of "user-zoom" */
+ set userZoom(String value) {
+ setProperty('user-zoom', value, '');
+ }
+
+ /** Gets the value of "vertical-align" */
+ String get verticalAlign =>
+ getPropertyValue('vertical-align');
+
+ /** Sets the value of "vertical-align" */
+ set verticalAlign(String value) {
+ setProperty('vertical-align', value, '');
+ }
+
+ /** Gets the value of "visibility" */
+ String get visibility =>
+ getPropertyValue('visibility');
+
+ /** Sets the value of "visibility" */
+ set visibility(String value) {
+ setProperty('visibility', value, '');
+ }
+
+ /** Gets the value of "white-space" */
+ String get whiteSpace =>
+ getPropertyValue('white-space');
+
+ /** Sets the value of "white-space" */
+ set whiteSpace(String value) {
+ setProperty('white-space', value, '');
+ }
+
+ /** Gets the value of "widows" */
+ String get widows =>
+ getPropertyValue('widows');
+
+ /** Sets the value of "widows" */
+ set widows(String value) {
+ setProperty('widows', value, '');
+ }
+
+ /** Gets the value of "width" */
+ String get width =>
+ getPropertyValue('width');
+
+ /** Sets the value of "width" */
+ set width(String value) {
+ setProperty('width', value, '');
+ }
+
+ /** Gets the value of "will-change" */
+ String get willChange =>
+ getPropertyValue('will-change');
+
+ /** Sets the value of "will-change" */
+ set willChange(String value) {
+ setProperty('will-change', value, '');
+ }
+
+ /** Gets the value of "word-break" */
+ String get wordBreak =>
+ getPropertyValue('word-break');
+
+ /** Sets the value of "word-break" */
+ set wordBreak(String value) {
+ setProperty('word-break', value, '');
+ }
+
+ /** Gets the value of "word-spacing" */
+ String get wordSpacing =>
+ getPropertyValue('word-spacing');
+
+ /** Sets the value of "word-spacing" */
+ set wordSpacing(String value) {
+ setProperty('word-spacing', value, '');
+ }
+
+ /** Gets the value of "word-wrap" */
+ String get wordWrap =>
+ getPropertyValue('word-wrap');
+
+ /** Sets the value of "word-wrap" */
+ set wordWrap(String value) {
+ setProperty('word-wrap', value, '');
+ }
+
+ /** Gets the value of "wrap-flow" */
+ String get wrapFlow =>
+ getPropertyValue('wrap-flow');
+
+ /** Sets the value of "wrap-flow" */
+ set wrapFlow(String value) {
+ setProperty('wrap-flow', value, '');
+ }
+
+ /** Gets the value of "wrap-through" */
+ String get wrapThrough =>
+ getPropertyValue('wrap-through');
+
+ /** Sets the value of "wrap-through" */
+ set wrapThrough(String value) {
+ setProperty('wrap-through', value, '');
+ }
+
+ /** Gets the value of "writing-mode" */
+ String get writingMode =>
+ getPropertyValue('writing-mode');
+
+ /** Sets the value of "writing-mode" */
+ set writingMode(String value) {
+ setProperty('writing-mode', value, '');
+ }
+
+ /** Gets the value of "z-index" */
+ String get zIndex =>
+ getPropertyValue('z-index');
+
+ /** Sets the value of "z-index" */
+ set zIndex(String value) {
+ setProperty('z-index', value, '');
+ }
+
+ /** Gets the value of "zoom" */
+ String get zoom =>
+ getPropertyValue('zoom');
+
+ /** Sets the value of "zoom" */
+ set zoom(String value) {
+ setProperty('zoom', value, '');
+ }
+}
+// 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.
+
+
+@DocsEditable()
+/**
+ * A generic container for content on an HTML page;
+ * corresponds to the &lt;div&gt; tag.
+ *
+ * The [DivElement] is a generic container and does not have any semantic
+ * significance. It is functionally similar to [SpanElement].
+ *
+ * The [DivElement] is a block-level element, as opposed to [SpanElement],
+ * which is an inline-level element.
+ *
+ * Example usage:
+ *
+ * DivElement div = new DivElement();
+ * div.text = 'Here's my new DivElem
+ * document.body.elements.add(elem);
+ *
+ * See also:
+ *
+ * * [HTML <div> element](http://www.w3.org/TR/html-markup/div.html) from W3C.
+ * * [Block-level element](http://www.w3.org/TR/CSS2/visuren.html#block-boxes) from W3C.
+ * * [Inline-level element](http://www.w3.org/TR/CSS2/visuren.html#inline-boxes) from W3C.
+ */
+@DomName('HTMLDivElement')
+@Native("HTMLDivElement")
+class DivElement extends HtmlElement {
+ // To suppress missing implicit constructor warnings.
+ factory DivElement._() { throw new UnsupportedError("Not supported"); }
+
+ @DomName('HTMLDivElement.HTMLDivElement')
+ @DocsEditable()
+ factory DivElement() => document.createElement("div");
+
+
+ @Deprecated("Internal Use Only")
+ static DivElement internalCreateDivElement() {
+ return new DivElement.internal_();
+ }
+
+ @Deprecated("Internal Use Only")
+ DivElement.internal_() : super.internal_();
+
+}
+// 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.
+
+
+@DocsEditable()
+/**
+ * The base class for all documents.
+ *
+ * Each web page loaded in the browser has its own [Document] object, which is
+ * typically an [HtmlDocument].
+ *
+ * If you aren't comfortable with DOM concepts, see the Dart tutorial
+ * [Target 2: Connect Dart & HTML](http://www.dartlang.org/docs/tutorials/connect-dart-html/).
+ */
+@DomName('Document')
+@Native("Document")
+class Document extends Node
+{
+
+ // To suppress missing implicit constructor warnings.
+ factory Document._() { throw new UnsupportedError("Not supported"); }
+
+ @DomName('Document.pointerlockchangeEvent')
+ @DocsEditable()
+ @Experimental() // untriaged
+ static const EventStreamProvider<Event> pointerLockChangeEvent = const EventStreamProvider<Event>('pointerlockchange');
+
+ @DomName('Document.pointerlockerrorEvent')
+ @DocsEditable()
+ @Experimental() // untriaged
+ static const EventStreamProvider<Event> pointerLockErrorEvent = const EventStreamProvider<Event>('pointerlockerror');
+
+ /**
+ * Static factory designed to expose `readystatechange` events to event
+ * handlers that are not necessarily instances of [Document].
+ *
+ * See [EventStreamProvider] for usage information.
+ */
+ @DomName('Document.readystatechangeEvent')
+ @DocsEditable()
+ static const EventStreamProvider<Event> readyStateChangeEvent = const EventStreamProvider<Event>('readystatechange');
+
+ /**
+ * Static factory designed to expose `selectionchange` events to event
+ * handlers that are not necessarily instances of [Document].
+ *
+ * See [EventStreamProvider] for usage information.
+ */
+ @DomName('Document.selectionchangeEvent')
+ @DocsEditable()
+ static const EventStreamProvider<Event> selectionChangeEvent = const EventStreamProvider<Event>('selectionchange');
+
+
+ @Deprecated("Internal Use Only")
+ static Document internalCreateDocument() {
+ return new Document.internal_();
+ }
+
+ @Deprecated("Internal Use Only")
+ Document.internal_() : super.internal_();
+
+
+ @DomName('Document.activeElement')
+ @DocsEditable()
+ @Experimental() // untriaged
+ Element get activeElement => wrap_jso(JS("Element", "#.activeElement", this.raw));
+
+ @JSName('body')
+ @DomName('Document.body')
+ @DocsEditable()
+ HtmlElement get _body => wrap_jso(JS("HtmlElement", "#.body", this.raw));
+ @JSName('body')
+ @DomName('Document.body')
+ @DocsEditable()
+ void set _body(HtmlElement val) => JS("void", "#.body = #", this.raw, unwrap_jso(val));
+
+ @DomName('Document.contentType')
+ @DocsEditable()
+ @Experimental() // untriaged
+ String get contentType => wrap_jso(JS("String", "#.contentType", this.raw));
+
+ @DomName('Document.cookie')
+ @DocsEditable()
+ String get cookie => wrap_jso(JS("String", "#.cookie", this.raw));
+ @DomName('Document.cookie')
+ @DocsEditable()
+ void set cookie(String val) => JS("void", "#.cookie = #", this.raw, unwrap_jso(val));
+
+ @DomName('Document.currentScript')
+ @DocsEditable()
+ @Experimental() // untriaged
+ HtmlElement get currentScript => wrap_jso(JS("HtmlElement", "#.currentScript", this.raw));
+
+ @DomName('Document.window')
+ @DocsEditable()
+ @Experimental() // untriaged
+ WindowBase get window => _convertNativeToDart_Window(this._get_window);
+ @JSName('defaultView')
+ @DomName('Document.window')
+ @DocsEditable()
+ @Experimental() // untriaged
+ @Creates('Window|=Object')
+ @Returns('Window|=Object')
+ @Creates('Window|=Object|Null')
+ @Returns('Window|=Object|Null')
+ dynamic get _get_window => wrap_jso(JS("dynamic", "#.defaultView", this.raw));
+
+ @DomName('Document.documentElement')
+ @DocsEditable()
+ Element get documentElement => wrap_jso(JS("Element", "#.documentElement", this.raw));
+
+ @DomName('Document.domain')
+ @DocsEditable()
+ String get domain => wrap_jso(JS("String", "#.domain", this.raw));
+
+ @DomName('Document.fullscreenElement')
+ @DocsEditable()
+ @Experimental() // untriaged
+ Element get fullscreenElement => wrap_jso(JS("Element", "#.fullscreenElement", this.raw));
+
+ @DomName('Document.fullscreenEnabled')
+ @DocsEditable()
+ @Experimental() // untriaged
+ bool get fullscreenEnabled => wrap_jso(JS("bool", "#.fullscreenEnabled", this.raw));
+
+ @JSName('head')
+ @DomName('Document.head')
+ @DocsEditable()
+ HeadElement get _head => wrap_jso(JS("HeadElement", "#.head", this.raw));
+
+ @DomName('Document.hidden')
+ @DocsEditable()
+ @Experimental() // untriaged
+ bool get hidden => wrap_jso(JS("bool", "#.hidden", this.raw));
+
+ @DomName('Document.implementation')
+ @DocsEditable()
+ DomImplementation get implementation => wrap_jso(JS("DomImplementation", "#.implementation", this.raw));
+
+ @JSName('lastModified')
+ @DomName('Document.lastModified')
+ @DocsEditable()
+ String get _lastModified => wrap_jso(JS("String", "#.lastModified", this.raw));
+
+ @DomName('Document.pointerLockElement')
+ @DocsEditable()
+ @Experimental() // untriaged
+ Element get pointerLockElement => wrap_jso(JS("Element", "#.pointerLockElement", this.raw));
+
+ @JSName('preferredStylesheetSet')
+ @DomName('Document.preferredStylesheetSet')
+ @DocsEditable()
+ String get _preferredStylesheetSet => wrap_jso(JS("String", "#.preferredStylesheetSet", this.raw));
+
+ @DomName('Document.readyState')
+ @DocsEditable()
+ String get readyState => wrap_jso(JS("String", "#.readyState", this.raw));
+
+ @JSName('referrer')
+ @DomName('Document.referrer')
+ @DocsEditable()
+ String get _referrer => wrap_jso(JS("String", "#.referrer", this.raw));
+
+ @DomName('Document.rootElement')
+ @DocsEditable()
+ @Experimental() // untriaged
+ Element get rootElement => wrap_jso(JS("Element", "#.rootElement", this.raw));
+
+ @JSName('selectedStylesheetSet')
+ @DomName('Document.selectedStylesheetSet')
+ @DocsEditable()
+ String get _selectedStylesheetSet => wrap_jso(JS("String", "#.selectedStylesheetSet", this.raw));
+ @JSName('selectedStylesheetSet')
+ @DomName('Document.selectedStylesheetSet')
+ @DocsEditable()
+ void set _selectedStylesheetSet(String val) => JS("void", "#.selectedStylesheetSet = #", this.raw, unwrap_jso(val));
+
+ @JSName('title')
+ @DomName('Document.title')
+ @DocsEditable()
+ String get _title => wrap_jso(JS("String", "#.title", this.raw));
+ @JSName('title')
+ @DomName('Document.title')
+ @DocsEditable()
+ void set _title(String val) => JS("void", "#.title = #", this.raw, unwrap_jso(val));
+
+ @DomName('Document.visibilityState')
+ @DocsEditable()
+ @Experimental() // untriaged
+ String get visibilityState => wrap_jso(JS("String", "#.visibilityState", this.raw));
+
+ @JSName('webkitFullscreenElement')
+ @DomName('Document.webkitFullscreenElement')
+ @DocsEditable()
+ @SupportedBrowser(SupportedBrowser.CHROME)
+ @SupportedBrowser(SupportedBrowser.SAFARI)
+ @Experimental()
+ // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html#dom-document-fullscreenelement
+ Element get _webkitFullscreenElement => wrap_jso(JS("Element", "#.webkitFullscreenElement", this.raw));
+
+ @JSName('webkitFullscreenEnabled')
+ @DomName('Document.webkitFullscreenEnabled')
+ @DocsEditable()
+ @SupportedBrowser(SupportedBrowser.CHROME)
+ @SupportedBrowser(SupportedBrowser.SAFARI)
+ @Experimental()
+ // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html#dom-document-fullscreenenabled
+ bool get _webkitFullscreenEnabled => wrap_jso(JS("bool", "#.webkitFullscreenEnabled", this.raw));
+
+ @JSName('webkitHidden')
+ @DomName('Document.webkitHidden')
+ @DocsEditable()
+ @SupportedBrowser(SupportedBrowser.CHROME)
+ @SupportedBrowser(SupportedBrowser.SAFARI)
+ @Experimental()
+ // https://dvcs.w3.org/hg/webperf/raw-file/tip/specs/PageVisibility/Overview.html#document
+ bool get _webkitHidden => wrap_jso(JS("bool", "#.webkitHidden", this.raw));
+
+ @JSName('webkitVisibilityState')
+ @DomName('Document.webkitVisibilityState')
+ @DocsEditable()
+ @SupportedBrowser(SupportedBrowser.CHROME)
+ @SupportedBrowser(SupportedBrowser.SAFARI)
+ @Experimental()
+ // https://dvcs.w3.org/hg/webperf/raw-file/tip/specs/PageVisibility/Overview.html#dom-document-visibilitystate
+ String get _webkitVisibilityState => wrap_jso(JS("String", "#.webkitVisibilityState", this.raw));
+
+ @DomName('Document.adoptNode')
+ @DocsEditable()
+ Node adoptNode(Node node) {
+ return _adoptNode_1(node);
+ }
+ @JSName('adoptNode')
+ @DomName('Document.adoptNode')
+ @DocsEditable()
+ Node _adoptNode_1(Node node) => wrap_jso(JS("Node ", "#.raw.adoptNode(#)", this, unwrap_jso(node)));
+
+ @DomName('Document.caretRangeFromPoint')
+ @DocsEditable()
+ // http://www.w3.org/TR/2009/WD-cssom-view-20090804/#dom-documentview-caretrangefrompoint
+ @Experimental()
+ Range _caretRangeFromPoint(int x, int y) {
+ return _caretRangeFromPoint_1(x, y);
+ }
+ @JSName('caretRangeFromPoint')
+ @DomName('Document.caretRangeFromPoint')
+ @DocsEditable()
+ // http://www.w3.org/TR/2009/WD-cssom-view-20090804/#dom-documentview-caretrangefrompoint
+ @Experimental()
+ Range _caretRangeFromPoint_1(x, y) => wrap_jso(JS("Range ", "#.raw.caretRangeFromPoint(#, #)", this, unwrap_jso(x), unwrap_jso(y)));
+
+ @DomName('Document.createDocumentFragment')
+ @DocsEditable()
+ DocumentFragment createDocumentFragment() {
+ return _createDocumentFragment_1();
+ }
+ @JSName('createDocumentFragment')
+ @DomName('Document.createDocumentFragment')
+ @DocsEditable()
+ DocumentFragment _createDocumentFragment_1() => wrap_jso(JS("DocumentFragment ", "#.raw.createDocumentFragment()", this));
+
+ @DomName('Document.createElement')
+ @DocsEditable()
+ Element _createElement(String localName_OR_tagName, [String typeExtension]) {
+ if (typeExtension == null) {
+ return _createElement_1(localName_OR_tagName);
+ }
+ if (typeExtension != null) {
+ return _createElement_2(localName_OR_tagName, typeExtension);
+ }
+ throw new ArgumentError("Incorrect number or type of arguments");
+ }
+ @JSName('createElement')
+ @DomName('Document.createElement')
+ @DocsEditable()
+ Element _createElement_1(tagName) => wrap_jso(JS("Element ", "#.raw.createElement(#)", this, unwrap_jso(tagName)));
+ @JSName('createElement')
+ @DomName('Document.createElement')
+ @DocsEditable()
+ Element _createElement_2(localName, typeExtension) => wrap_jso(JS("Element ", "#.raw.createElement(#, #)", this, unwrap_jso(localName), unwrap_jso(typeExtension)));
+
+ @DomName('Document.createElementNS')
+ @DocsEditable()
+ Element _createElementNS(String namespaceURI, String qualifiedName, [String typeExtension]) {
+ if (typeExtension == null) {
+ return _createElementNS_1(namespaceURI, qualifiedName);
+ }
+ if (typeExtension != null) {
+ return _createElementNS_2(namespaceURI, qualifiedName, typeExtension);
+ }
+ throw new ArgumentError("Incorrect number or type of arguments");
+ }
+ @JSName('createElementNS')
+ @DomName('Document.createElementNS')
+ @DocsEditable()
+ Element _createElementNS_1(namespaceURI, qualifiedName) => wrap_jso(JS("Element ", "#.raw.createElementNS(#, #)", this, unwrap_jso(namespaceURI), unwrap_jso(qualifiedName)));
+ @JSName('createElementNS')
+ @DomName('Document.createElementNS')
+ @DocsEditable()
+ Element _createElementNS_2(namespaceURI, qualifiedName, typeExtension) => wrap_jso(JS("Element ", "#.raw.createElementNS(#, #, #)", this, unwrap_jso(namespaceURI), unwrap_jso(qualifiedName), unwrap_jso(typeExtension)));
+
+ @DomName('Document.createEvent')
+ @DocsEditable()
+ Event _createEvent(String eventType) {
+ return _createEvent_1(eventType);
+ }
+ @JSName('createEvent')
+ @DomName('Document.createEvent')
+ @DocsEditable()
+ Event _createEvent_1(eventType) => wrap_jso(JS("Event ", "#.raw.createEvent(#)", this, unwrap_jso(eventType)));
+
+ @DomName('Document.createRange')
+ @DocsEditable()
+ Range createRange() {
+ return _createRange_1();
+ }
+ @JSName('createRange')
+ @DomName('Document.createRange')
+ @DocsEditable()
+ Range _createRange_1() => wrap_jso(JS("Range ", "#.raw.createRange()", this));
+
+ @DomName('Document.createTextNode')
+ @DocsEditable()
+ Text _createTextNode(String data) {
+ return _createTextNode_1(data);
+ }
+ @JSName('createTextNode')
+ @DomName('Document.createTextNode')
+ @DocsEditable()
+ Text _createTextNode_1(data) => wrap_jso(JS("Text ", "#.raw.createTextNode(#)", this, unwrap_jso(data)));
+
+ @DomName('Document.elementFromPoint')
+ @DocsEditable()
+ Element _elementFromPoint(int x, int y) {
+ return _elementFromPoint_1(x, y);
+ }
+ @JSName('elementFromPoint')
+ @DomName('Document.elementFromPoint')
+ @DocsEditable()
+ Element _elementFromPoint_1(x, y) => wrap_jso(JS("Element ", "#.raw.elementFromPoint(#, #)", this, unwrap_jso(x), unwrap_jso(y)));
+
+ @DomName('Document.execCommand')
+ @DocsEditable()
+ bool execCommand(String command, bool userInterface, String value) {
+ return _execCommand_1(command, userInterface, value);
+ }
+ @JSName('execCommand')
+ @DomName('Document.execCommand')
+ @DocsEditable()
+ bool _execCommand_1(command, userInterface, value) => wrap_jso(JS("bool ", "#.raw.execCommand(#, #, #)", this, unwrap_jso(command), unwrap_jso(userInterface), unwrap_jso(value)));
+
+ @DomName('Document.exitFullscreen')
+ @DocsEditable()
+ @Experimental() // untriaged
+ void exitFullscreen() {
+ _exitFullscreen_1();
+ return;
+ }
+ @JSName('exitFullscreen')
+ @DomName('Document.exitFullscreen')
+ @DocsEditable()
+ @Experimental() // untriaged
+ void _exitFullscreen_1() => wrap_jso(JS("void ", "#.raw.exitFullscreen()", this));
+
+ @DomName('Document.exitPointerLock')
+ @DocsEditable()
+ @Experimental() // untriaged
+ void exitPointerLock() {
+ _exitPointerLock_1();
+ return;
+ }
+ @JSName('exitPointerLock')
+ @DomName('Document.exitPointerLock')
+ @DocsEditable()
+ @Experimental() // untriaged
+ void _exitPointerLock_1() => wrap_jso(JS("void ", "#.raw.exitPointerLock()", this));
+
+ @DomName('Document.getCSSCanvasContext')
+ @DocsEditable()
+ // https://developer.apple.com/library/safari/#documentation/AppleApplications/Reference/SafariCSSRef/Articles/Functions.html
+ @Experimental() // non-standard
+ Object _getCssCanvasContext(String contextId, String name, int width, int height) {
+ return _getCssCanvasContext_1(contextId, name, width, height);
+ }
+ @JSName('getCSSCanvasContext')
+ @DomName('Document.getCSSCanvasContext')
+ @DocsEditable()
+ // https://developer.apple.com/library/safari/#documentation/AppleApplications/Reference/SafariCSSRef/Articles/Functions.html
+ @Experimental() // non-standard
+ Object _getCssCanvasContext_1(contextId, name, width, height) => wrap_jso(JS("Object ", "#.raw.getCSSCanvasContext(#, #, #, #)", this, unwrap_jso(contextId), unwrap_jso(name), unwrap_jso(width), unwrap_jso(height)));
+
+ @DomName('Document.getElementById')
+ @DocsEditable()
+ Element getElementById(String elementId) {
+ return _getElementById_1(elementId);
+ }
+ @JSName('getElementById')
+ @DomName('Document.getElementById')
+ @DocsEditable()
+ Element _getElementById_1(elementId) => wrap_jso(JS("Element ", "#.raw.getElementById(#)", this, unwrap_jso(elementId)));
+
+ @DomName('Document.getElementsByClassName')
+ @DocsEditable()
+ @Creates('NodeList|HtmlCollection')
+ @Returns('NodeList|HtmlCollection')
+ HtmlCollection getElementsByClassName(String classNames) {
+ return _getElementsByClassName_1(classNames);
+ }
+ @JSName('getElementsByClassName')
+ @DomName('Document.getElementsByClassName')
+ @DocsEditable()
+ @Creates('NodeList|HtmlCollection')
+ @Returns('NodeList|HtmlCollection')
+ HtmlCollection _getElementsByClassName_1(classNames) => wrap_jso(JS("HtmlCollection ", "#.raw.getElementsByClassName(#)", this, unwrap_jso(classNames)));
+
+ @DomName('Document.getElementsByName')
+ @DocsEditable()
+ @Creates('NodeList|HtmlCollection')
+ @Returns('NodeList|HtmlCollection')
+ NodeList getElementsByName(String elementName) {
+ return _getElementsByName_1(elementName);
+ }
+ @JSName('getElementsByName')
+ @DomName('Document.getElementsByName')
+ @DocsEditable()
+ @Creates('NodeList|HtmlCollection')
+ @Returns('NodeList|HtmlCollection')
+ NodeList _getElementsByName_1(elementName) => wrap_jso(JS("NodeList ", "#.raw.getElementsByName(#)", this, unwrap_jso(elementName)));
+
+ @DomName('Document.getElementsByTagName')
+ @DocsEditable()
+ @Creates('NodeList|HtmlCollection')
+ @Returns('NodeList|HtmlCollection')
+ HtmlCollection getElementsByTagName(String localName) {
+ return _getElementsByTagName_1(localName);
+ }
+ @JSName('getElementsByTagName')
+ @DomName('Document.getElementsByTagName')
+ @DocsEditable()
+ @Creates('NodeList|HtmlCollection')
+ @Returns('NodeList|HtmlCollection')
+ HtmlCollection _getElementsByTagName_1(localName) => wrap_jso(JS("HtmlCollection ", "#.raw.getElementsByTagName(#)", this, unwrap_jso(localName)));
+
+ @DomName('Document.importNode')
+ @DocsEditable()
+ Node importNode(Node node, [bool deep]) {
+ if (deep != null) {
+ return _importNode_1(node, deep);
+ }
+ return _importNode_2(node);
+ }
+ @JSName('importNode')
+ @DomName('Document.importNode')
+ @DocsEditable()
+ Node _importNode_1(Node node, deep) => wrap_jso(JS("Node ", "#.raw.importNode(#, #)", this, unwrap_jso(node), unwrap_jso(deep)));
+ @JSName('importNode')
+ @DomName('Document.importNode')
+ @DocsEditable()
+ Node _importNode_2(Node node) => wrap_jso(JS("Node ", "#.raw.importNode(#)", this, unwrap_jso(node)));
+
+ @DomName('Document.queryCommandEnabled')
+ @DocsEditable()
+ bool queryCommandEnabled(String command) {
+ return _queryCommandEnabled_1(command);
+ }
+ @JSName('queryCommandEnabled')
+ @DomName('Document.queryCommandEnabled')
+ @DocsEditable()
+ bool _queryCommandEnabled_1(command) => wrap_jso(JS("bool ", "#.raw.queryCommandEnabled(#)", this, unwrap_jso(command)));
+
+ @DomName('Document.queryCommandIndeterm')
+ @DocsEditable()
+ bool queryCommandIndeterm(String command) {
+ return _queryCommandIndeterm_1(command);
+ }
+ @JSName('queryCommandIndeterm')
+ @DomName('Document.queryCommandIndeterm')
+ @DocsEditable()
+ bool _queryCommandIndeterm_1(command) => wrap_jso(JS("bool ", "#.raw.queryCommandIndeterm(#)", this, unwrap_jso(command)));
+
+ @DomName('Document.queryCommandState')
+ @DocsEditable()
+ bool queryCommandState(String command) {
+ return _queryCommandState_1(command);
+ }
+ @JSName('queryCommandState')
+ @DomName('Document.queryCommandState')
+ @DocsEditable()
+ bool _queryCommandState_1(command) => wrap_jso(JS("bool ", "#.raw.queryCommandState(#)", this, unwrap_jso(command)));
+
+ @DomName('Document.queryCommandSupported')
+ @DocsEditable()
+ bool queryCommandSupported(String command) {
+ return _queryCommandSupported_1(command);
+ }
+ @JSName('queryCommandSupported')
+ @DomName('Document.queryCommandSupported')
+ @DocsEditable()
+ bool _queryCommandSupported_1(command) => wrap_jso(JS("bool ", "#.raw.queryCommandSupported(#)", this, unwrap_jso(command)));
+
+ @DomName('Document.queryCommandValue')
+ @DocsEditable()
+ String queryCommandValue(String command) {
+ return _queryCommandValue_1(command);
+ }
+ @JSName('queryCommandValue')
+ @DomName('Document.queryCommandValue')
+ @DocsEditable()
+ String _queryCommandValue_1(command) => wrap_jso(JS("String ", "#.raw.queryCommandValue(#)", this, unwrap_jso(command)));
+
+ @DomName('Document.transformDocumentToTreeView')
+ @DocsEditable()
+ @Experimental() // untriaged
+ void transformDocumentToTreeView(String noStyleMessage) {
+ _transformDocumentToTreeView_1(noStyleMessage);
+ return;
+ }
+ @JSName('transformDocumentToTreeView')
+ @DomName('Document.transformDocumentToTreeView')
+ @DocsEditable()
+ @Experimental() // untriaged
+ void _transformDocumentToTreeView_1(noStyleMessage) => wrap_jso(JS("void ", "#.raw.transformDocumentToTreeView(#)", this, unwrap_jso(noStyleMessage)));
+
+ @DomName('Document.webkitExitFullscreen')
+ @DocsEditable()
+ @SupportedBrowser(SupportedBrowser.CHROME)
+ @SupportedBrowser(SupportedBrowser.SAFARI)
+ @Experimental()
+ // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html#dom-document-exitfullscreen
+ void _webkitExitFullscreen() {
+ _webkitExitFullscreen_1();
+ return;
+ }
+ @JSName('webkitExitFullscreen')
+ @DomName('Document.webkitExitFullscreen')
+ @DocsEditable()
+ @SupportedBrowser(SupportedBrowser.CHROME)
+ @SupportedBrowser(SupportedBrowser.SAFARI)
+ @Experimental()
+ // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html#dom-document-exitfullscreen
+ void _webkitExitFullscreen_1() => wrap_jso(JS("void ", "#.raw.webkitExitFullscreen()", this));
+
+ // From ParentNode
+
+ @JSName('childElementCount')
+ @DomName('Document.childElementCount')
+ @DocsEditable()
+ int get _childElementCount => wrap_jso(JS("int", "#.childElementCount", this.raw));
+
+ @JSName('children')
+ @DomName('Document.children')
+ @DocsEditable()
+ @Returns('HtmlCollection')
+ @Creates('HtmlCollection')
+ List<Node> get _children => wrap_jso(JS("List<Node>", "#.children", this.raw));
+
+ @JSName('firstElementChild')
+ @DomName('Document.firstElementChild')
+ @DocsEditable()
+ Element get _firstElementChild => wrap_jso(JS("Element", "#.firstElementChild", this.raw));
+
+ @JSName('lastElementChild')
+ @DomName('Document.lastElementChild')
+ @DocsEditable()
+ Element get _lastElementChild => wrap_jso(JS("Element", "#.lastElementChild", this.raw));
+
+ /**
+ * Finds the first descendant element of this document that matches the
+ * specified group of selectors.
+ *
+ * Unless your webpage contains multiple documents, the top-level
+ * [querySelector]
+ * method behaves the same as this method, so you should use it instead to
+ * save typing a few characters.
+ *
+ * [selectors] should be a string using CSS selector syntax.
+ *
+ * var element1 = document.querySelector('.className');
+ * var element2 = document.querySelector('#id');
+ *
+ * For details about CSS selector syntax, see the
+ * [CSS selector specification](http://www.w3.org/TR/css3-selectors/).
+ */
+ @DomName('Document.querySelector')
+ @DocsEditable()
+ Element querySelector(String selectors) {
+ return _querySelector_1(selectors);
+ }
+ @JSName('querySelector')
+ /**
+ * Finds the first descendant element of this document that matches the
+ * specified group of selectors.
+ *
+ * Unless your webpage contains multiple documents, the top-level
+ * [querySelector]
+ * method behaves the same as this method, so you should use it instead to
+ * save typing a few characters.
+ *
+ * [selectors] should be a string using CSS selector syntax.
+ *
+ * var element1 = document.querySelector('.className');
+ * var element2 = document.querySelector('#id');
+ *
+ * For details about CSS selector syntax, see the
+ * [CSS selector specification](http://www.w3.org/TR/css3-selectors/).
+ */
+ @DomName('Document.querySelector')
+ @DocsEditable()
+ Element _querySelector_1(selectors) => wrap_jso(JS("Element ", "#.raw.querySelector(#)", this, unwrap_jso(selectors)));
+
+ @DomName('Document.querySelectorAll')
+ @DocsEditable()
+ @Returns('NodeList')
+ @Creates('NodeList')
+ NodeList _querySelectorAll(String selectors) {
+ return _querySelectorAll_1(selectors);
+ }
+ @JSName('querySelectorAll')
+ @DomName('Document.querySelectorAll')
+ @DocsEditable()
+ @Returns('NodeList')
+ @Creates('NodeList')
+ NodeList _querySelectorAll_1(selectors) => wrap_jso(JS("NodeList ", "#.raw.querySelectorAll(#)", this, unwrap_jso(selectors)));
+
+ /// Stream of `beforecopy` events handled by this [Document].
+ @DomName('Document.onbeforecopy')
+ @DocsEditable()
+ Stream<Event> get onBeforeCopy => Element.beforeCopyEvent.forTarget(this);
+
+ /// Stream of `beforecut` events handled by this [Document].
+ @DomName('Document.onbeforecut')
+ @DocsEditable()
+ Stream<Event> get onBeforeCut => Element.beforeCutEvent.forTarget(this);
+
+ /// Stream of `beforepaste` events handled by this [Document].
+ @DomName('Document.onbeforepaste')
+ @DocsEditable()
+ Stream<Event> get onBeforePaste => Element.beforePasteEvent.forTarget(this);
+
+ /// Stream of `copy` events handled by this [Document].
+ @DomName('Document.oncopy')
+ @DocsEditable()
+ Stream<Event> get onCopy => Element.copyEvent.forTarget(this);
+
+ /// Stream of `cut` events handled by this [Document].
+ @DomName('Document.oncut')
+ @DocsEditable()
+ Stream<Event> get onCut => Element.cutEvent.forTarget(this);
+
+ /// Stream of `paste` events handled by this [Document].
+ @DomName('Document.onpaste')
+ @DocsEditable()
+ Stream<Event> get onPaste => Element.pasteEvent.forTarget(this);
+
+ @DomName('Document.onpointerlockchange')
+ @DocsEditable()
+ @Experimental() // untriaged
+ Stream<Event> get onPointerLockChange => pointerLockChangeEvent.forTarget(this);
+
+ @DomName('Document.onpointerlockerror')
+ @DocsEditable()
+ @Experimental() // untriaged
+ Stream<Event> get onPointerLockError => pointerLockErrorEvent.forTarget(this);
+
+ /// Stream of `readystatechange` events handled by this [Document].
+ @DomName('Document.onreadystatechange')
+ @DocsEditable()
+ Stream<Event> get onReadyStateChange => readyStateChangeEvent.forTarget(this);
+
+ /// Stream of `search` events handled by this [Document].
+ @DomName('Document.onsearch')
+ @DocsEditable()
+ // http://www.w3.org/TR/html-markup/input.search.html
+ @Experimental()
+ Stream<Event> get onSearch => Element.searchEvent.forTarget(this);
+
+ /// Stream of `selectionchange` events handled by this [Document].
+ @DomName('Document.onselectionchange')
+ @DocsEditable()
+ Stream<Event> get onSelectionChange => selectionChangeEvent.forTarget(this);
+
+ /// Stream of `selectstart` events handled by this [Document].
+ @DomName('Document.onselectstart')
+ @DocsEditable()
+ Stream<Event> get onSelectStart => Element.selectStartEvent.forTarget(this);
+
+ /// Stream of `fullscreenchange` events handled by this [Document].
+ @DomName('Document.onwebkitfullscreenchange')
+ @DocsEditable()
+ // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
+ @Experimental()
+ Stream<Event> get onFullscreenChange => Element.fullscreenChangeEvent.forTarget(this);
+
+ /// Stream of `fullscreenerror` events handled by this [Document].
+ @DomName('Document.onwebkitfullscreenerror')
+ @DocsEditable()
+ // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
+ @Experimental()
+ Stream<Event> get onFullscreenError => Element.fullscreenErrorEvent.forTarget(this);
+
+ /**
+ * Finds all descendant elements of this document that match the specified
+ * group of selectors.
+ *
+ * Unless your webpage contains multiple documents, the top-level
+ * [querySelectorAll]
+ * method behaves the same as this method, so you should use it instead to
+ * save typing a few characters.
+ *
+ * [selectors] should be a string using CSS selector syntax.
+ *
+ * var items = document.querySelectorAll('.itemClassName');
+ *
+ * For details about CSS selector syntax, see the
+ * [CSS selector specification](http://www.w3.org/TR/css3-selectors/).
+ */
+ ElementList<Element> querySelectorAll(String selectors) {
+ return new _FrozenElementList._wrap(_querySelectorAll(selectors));
+ }
+
+ /**
+ * Alias for [querySelector]. Note this function is deprecated because its
+ * semantics will be changing in the future.
+ */
+ @deprecated
+ @Experimental()
+ @DomName('Document.querySelector')
+ Element query(String relativeSelectors) => querySelector(relativeSelectors);
+
+ /**
+ * Alias for [querySelectorAll]. Note this function is deprecated because its
+ * semantics will be changing in the future.
+ */
+ @deprecated
+ @Experimental()
+ @DomName('Document.querySelectorAll')
+ ElementList<Element> queryAll(String relativeSelectors) =>
+ querySelectorAll(relativeSelectors);
+
+ /// Checks if [registerElement] is supported on the current platform.
+ bool get supportsRegisterElement {
+ return true;
+ }
+
+ /// *Deprecated*: use [supportsRegisterElement] instead.
+ @deprecated
+ bool get supportsRegister => supportsRegisterElement;
+
+ @DomName('Document.createElement')
+ Element createElement(String tagName, [String typeExtension]) {
+ return _createElement(tagName, typeExtension);
+ }
+
+ @DomName('Document.createElementNS')
+ @DocsEditable()
+ Element createElementNS(String namespaceURI, String qualifiedName, [String typeExtension]) {
+ return _createElementNS(namespaceURI, qualifiedName, typeExtension);
+ }
+
+}
+// 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.
+
+
+@DomName('DocumentFragment')
+@Native("DocumentFragment")
+class DocumentFragment extends Node implements ParentNode {
+ factory DocumentFragment() => document.createDocumentFragment();
+
+ factory DocumentFragment.html(String html,
+ {NodeValidator validator, NodeTreeSanitizer treeSanitizer}) {
+
+ return document.body.createFragment(html,
+ validator: validator, treeSanitizer: treeSanitizer);
+ }
+
+ factory DocumentFragment.svg(String svgContent,
+ {NodeValidator validator, NodeTreeSanitizer treeSanitizer}) {
+ throw 'SVG not supported in DDC';
+ }
+
+ HtmlCollection get _children => throw new UnimplementedError(
+ 'Use _docChildren instead');
+
+ List<Element> _docChildren;
+
+ List<Element> get children {
+ if (_docChildren == null) {
+ _docChildren = new FilteredElementList(this);
+ }
+ return _docChildren;
+ }
+
+ set children(List<Element> value) {
+ // Copy list first since we don't want liveness during iteration.
+ List copy = new List.from(value);
+ var children = this.children;
+ children.clear();
+ children.addAll(copy);
+ }
+
+ /**
+ * Finds all descendant elements of this document fragment that match the
+ * specified group of selectors.
+ *
+ * [selectors] should be a string using CSS selector syntax.
+ *
+ * var items = document.querySelectorAll('.itemClassName');
+ *
+ * For details about CSS selector syntax, see the
+ * [CSS selector specification](http://www.w3.org/TR/css3-selectors/).
+ */
+ ElementList<Element> querySelectorAll(String selectors) =>
+ new _FrozenElementList._wrap(_querySelectorAll(selectors));
+
+ String get innerHtml {
+ final e = new Element.tag("div");
+ e.append(this.clone(true));
+ return e.innerHtml;
+ }
+
+ set innerHtml(String value) {
+ this.setInnerHtml(value);
+ }
+
+ void setInnerHtml(String html,
+ {NodeValidator validator, NodeTreeSanitizer treeSanitizer}) {
+
+ this.nodes.clear();
+ append(document.body.createFragment(
+ html, validator: validator, treeSanitizer: treeSanitizer));
+ }
+
+ /**
+ * Adds the specified text as a text node after the last child of this
+ * document fragment.
+ */
+ void appendText(String text) {
+ this.append(new Text(text));
+ }
+
+
+ /**
+ * Parses the specified text as HTML and adds the resulting node after the
+ * last child of this document fragment.
+ */
+ void appendHtml(String text, {NodeValidator validator,
+ NodeTreeSanitizer, treeSanitizer}) {
+ this.append(new DocumentFragment.html(text, validator: validator,
+ treeSanitizer: treeSanitizer));
+ }
+
+ /**
+ * Alias for [querySelector]. Note this function is deprecated because its
+ * semantics will be changing in the future.
+ */
+ @deprecated
+ @Experimental()
+ @DomName('DocumentFragment.querySelector')
+ Element query(String relativeSelectors) {
+ return querySelector(relativeSelectors);
+ }
+
+ /**
+ * Alias for [querySelectorAll]. Note this function is deprecated because its
+ * semantics will be changing in the future.
+ */
+ @deprecated
+ @Experimental()
+ @DomName('DocumentFragment.querySelectorAll')
+ ElementList<Element> queryAll(String relativeSelectors) {
+ return querySelectorAll(relativeSelectors);
+ }
+ // To suppress missing implicit constructor warnings.
+ factory DocumentFragment._() { throw new UnsupportedError("Not supported"); }
+
+
+ @Deprecated("Internal Use Only")
+ static DocumentFragment internalCreateDocumentFragment() {
+ return new DocumentFragment.internal_();
+ }
+
+ @Deprecated("Internal Use Only")
+ DocumentFragment.internal_() : super.internal_();
+
+
+ @DomName('DocumentFragment.getElementById')
+ @DocsEditable()
+ @Experimental() // untriaged
+ Element getElementById(String elementId) {
+ return _getElementById_1(elementId);
+ }
+ @JSName('getElementById')
+ @DomName('DocumentFragment.getElementById')
+ @DocsEditable()
+ @Experimental() // untriaged
+ Element _getElementById_1(elementId) => wrap_jso(JS("Element ", "#.raw.getElementById(#)", this, unwrap_jso(elementId)));
+
+ // From ParentNode
+
+ @JSName('childElementCount')
+ @DomName('DocumentFragment.childElementCount')
+ @DocsEditable()
+ int get _childElementCount => wrap_jso(JS("int", "#.childElementCount", this.raw));
+
+ @JSName('firstElementChild')
+ @DomName('DocumentFragment.firstElementChild')
+ @DocsEditable()
+ Element get _firstElementChild => wrap_jso(JS("Element", "#.firstElementChild", this.raw));
+
+ @JSName('lastElementChild')
+ @DomName('DocumentFragment.lastElementChild')
+ @DocsEditable()
+ Element get _lastElementChild => wrap_jso(JS("Element", "#.lastElementChild", this.raw));
+
+ /**
+ * Finds the first descendant element of this document fragment that matches
+ * the specified group of selectors.
+ *
+ * [selectors] should be a string using CSS selector syntax.
+ *
+ * var element1 = fragment.querySelector('.className');
+ * var element2 = fragment.querySelector('#id');
+ *
+ * For details about CSS selector syntax, see the
+ * [CSS selector specification](http://www.w3.org/TR/css3-selectors/).
+ */
+ @DomName('DocumentFragment.querySelector')
+ @DocsEditable()
+ Element querySelector(String selectors) {
+ return _querySelector_1(selectors);
+ }
+ @JSName('querySelector')
+ /**
+ * Finds the first descendant element of this document fragment that matches
+ * the specified group of selectors.
+ *
+ * [selectors] should be a string using CSS selector syntax.
+ *
+ * var element1 = fragment.querySelector('.className');
+ * var element2 = fragment.querySelector('#id');
+ *
+ * For details about CSS selector syntax, see the
+ * [CSS selector specification](http://www.w3.org/TR/css3-selectors/).
+ */
+ @DomName('DocumentFragment.querySelector')
+ @DocsEditable()
+ Element _querySelector_1(selectors) => wrap_jso(JS("Element ", "#.raw.querySelector(#)", this, unwrap_jso(selectors)));
+
+ @DomName('DocumentFragment.querySelectorAll')
+ @DocsEditable()
+ @Returns('NodeList')
+ @Creates('NodeList')
+ NodeList _querySelectorAll(String selectors) {
+ return _querySelectorAll_1(selectors);
+ }
+ @JSName('querySelectorAll')
+ @DomName('DocumentFragment.querySelectorAll')
+ @DocsEditable()
+ @Returns('NodeList')
+ @Creates('NodeList')
+ NodeList _querySelectorAll_1(selectors) => wrap_jso(JS("NodeList ", "#.raw.querySelectorAll(#)", this, unwrap_jso(selectors)));
+
+}
+// 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.
+
+
+@DocsEditable()
+@DomName('DOMImplementation')
+@Native("DOMImplementation")
+class DomImplementation extends DartHtmlDomObject {
+ // To suppress missing implicit constructor warnings.
+ factory DomImplementation._() { throw new UnsupportedError("Not supported"); }
+
+ @Deprecated("Internal Use Only")
+ static DomImplementation internalCreateDomImplementation() {
+ return new DomImplementation.internal_();
+ }
+
+ @Deprecated("Internal Use Only")
+ DomImplementation.internal_() { }
+
+ bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+ int get hashCode => unwrap_jso(this).hashCode;
+
+ @DomName('DOMImplementation.createDocument')
+ @DocsEditable()
+ Document createDocument(String namespaceURI, String qualifiedName, Node doctype) {
+ return _createDocument_1(namespaceURI, qualifiedName, doctype);
+ }
+ @JSName('createDocument')
+ @DomName('DOMImplementation.createDocument')
+ @DocsEditable()
+ Document _createDocument_1(namespaceURI, qualifiedName, Node doctype) => wrap_jso(JS("Document ", "#.raw.createDocument(#, #, #)", this, unwrap_jso(namespaceURI), unwrap_jso(qualifiedName), unwrap_jso(doctype)));
+
+ @DomName('DOMImplementation.createDocumentType')
+ @DocsEditable()
+ Node createDocumentType(String qualifiedName, String publicId, String systemId) {
+ return _createDocumentType_1(qualifiedName, publicId, systemId);
+ }
+ @JSName('createDocumentType')
+ @DomName('DOMImplementation.createDocumentType')
+ @DocsEditable()
+ Node _createDocumentType_1(qualifiedName, publicId, systemId) => wrap_jso(JS("Node ", "#.raw.createDocumentType(#, #, #)", this, unwrap_jso(qualifiedName), unwrap_jso(publicId), unwrap_jso(systemId)));
+
+ @DomName('DOMImplementation.createHTMLDocument')
+ @DocsEditable()
+ HtmlDocument createHtmlDocument(String title) {
+ return _createHtmlDocument_1(title);
+ }
+ @JSName('createHTMLDocument')
+ @DomName('DOMImplementation.createHTMLDocument')
+ @DocsEditable()
+ HtmlDocument _createHtmlDocument_1(title) => wrap_jso(JS("HtmlDocument ", "#.raw.createHTMLDocument(#)", this, unwrap_jso(title)));
+
+ @DomName('DOMImplementation.hasFeature')
+ @DocsEditable()
+ bool hasFeature(String feature, String version) {
+ return _hasFeature_1(feature, version);
+ }
+ @JSName('hasFeature')
+ @DomName('DOMImplementation.hasFeature')
+ @DocsEditable()
+ bool _hasFeature_1(feature, version) => wrap_jso(JS("bool ", "#.raw.hasFeature(#, #)", this, unwrap_jso(feature), unwrap_jso(version)));
+}
+// 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.
+
+
+@DocsEditable()
+@DomName('DOMTokenList')
+@Native("DOMTokenList")
+class DomTokenList extends DartHtmlDomObject {
+ // To suppress missing implicit constructor warnings.
+ factory DomTokenList._() { throw new UnsupportedError("Not supported"); }
+
+ @Deprecated("Internal Use Only")
+ static DomTokenList internalCreateDomTokenList() {
+ return new DomTokenList.internal_();
+ }
+
+ @Deprecated("Internal Use Only")
+ DomTokenList.internal_() { }
+
+ bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+ int get hashCode => unwrap_jso(this).hashCode;
+
+ @DomName('DOMTokenList.length')
+ @DocsEditable()
+ int get length => wrap_jso(JS("int", "#.length", this.raw));
+
+ @DomName('DOMTokenList.add')
+ @DocsEditable()
+ @Experimental() // untriaged
+ void add(String tokens) {
+ _add_1(tokens);
+ return;
+ }
+ @JSName('add')
+ @DomName('DOMTokenList.add')
+ @DocsEditable()
+ @Experimental() // untriaged
+ void _add_1(tokens) => wrap_jso(JS("void ", "#.raw.add(#)", this, unwrap_jso(tokens)));
+
+ @DomName('DOMTokenList.contains')
+ @DocsEditable()
+ bool contains(String token) {
+ return _contains_1(token);
+ }
+ @JSName('contains')
+ @DomName('DOMTokenList.contains')
+ @DocsEditable()
+ bool _contains_1(token) => wrap_jso(JS("bool ", "#.raw.contains(#)", this, unwrap_jso(token)));
+
+ @DomName('DOMTokenList.item')
+ @DocsEditable()
+ String item(int index) {
+ return _item_1(index);
+ }
+ @JSName('item')
+ @DomName('DOMTokenList.item')
+ @DocsEditable()
+ String _item_1(index) => wrap_jso(JS("String ", "#.raw.item(#)", this, unwrap_jso(index)));
+
+ @DomName('DOMTokenList.remove')
+ @DocsEditable()
+ @Experimental() // untriaged
+ void remove(String tokens) {
+ _remove_1(tokens);
+ return;
+ }
+ @JSName('remove')
+ @DomName('DOMTokenList.remove')
+ @DocsEditable()
+ @Experimental() // untriaged
+ void _remove_1(tokens) => wrap_jso(JS("void ", "#.raw.remove(#)", this, unwrap_jso(tokens)));
+
+ @DomName('DOMTokenList.toggle')
+ @DocsEditable()
+ bool toggle(String token, [bool force]) {
+ if (force != null) {
+ return _toggle_1(token, force);
+ }
+ return _toggle_2(token);
+ }
+ @JSName('toggle')
+ @DomName('DOMTokenList.toggle')
+ @DocsEditable()
+ bool _toggle_1(token, force) => wrap_jso(JS("bool ", "#.raw.toggle(#, #)", this, unwrap_jso(token), unwrap_jso(force)));
+ @JSName('toggle')
+ @DomName('DOMTokenList.toggle')
+ @DocsEditable()
+ bool _toggle_2(token) => wrap_jso(JS("bool ", "#.raw.toggle(#)", this, unwrap_jso(token)));
+}
+// 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.
+
+
+class _ChildrenElementList extends ListBase<Element>
+ implements NodeListWrapper {
+ // Raw Element.
+ final Element _element;
+ final HtmlCollection _childElements;
+
+ _ChildrenElementList._wrap(Element element)
+ : _childElements = element._children,
+ _element = element;
+
+ bool contains(Object element) => _childElements.contains(element);
+
+
+ bool get isEmpty {
+ return _element._firstElementChild == null;
+ }
+
+ int get length {
+ return _childElements.length;
+ }
+
+ Element operator [](int index) {
+ return _childElements[index];
+ }
+
+ void operator []=(int index, Element value) {
+ _element._replaceChild(value, _childElements[index]);
+ }
+
+ set length(int newLength) {
+ // TODO(jacobr): remove children when length is reduced.
+ throw new UnsupportedError('Cannot resize element lists');
+ }
+
+ Element add(Element value) {
+ _element.append(value);
+ return value;
+ }
+
+ Iterator<Element> get iterator => toList().iterator;
+
+ void addAll(Iterable<Element> iterable) {
+ if (iterable is _ChildNodeListLazy) {
+ iterable = new List.from(iterable);
+ }
+
+ for (Element element in iterable) {
+ _element.append(element);
+ }
+ }
+
+ void sort([int compare(Element a, Element b)]) {
+ throw new UnsupportedError('Cannot sort element lists');
+ }
+
+ void shuffle([Random random]) {
+ throw new UnsupportedError('Cannot shuffle element lists');
+ }
+
+ void removeWhere(bool test(Element element)) {
+ _filter(test, false);
+ }
+
+ void retainWhere(bool test(Element element)) {
+ _filter(test, true);
+ }
+
+ void _filter(bool test(var element), bool retainMatching) {
+ var removed;
+ if (retainMatching) {
+ removed = _element.children.where((e) => !test(e));
+ } else {
+ removed = _element.children.where(test);
+ }
+ for (var e in removed) e.remove();
+ }
+
+ void setRange(int start, int end, Iterable<Element> iterable,
+ [int skipCount = 0]) {
+ throw new UnimplementedError();
+ }
+
+ void replaceRange(int start, int end, Iterable<Element> iterable) {
+ throw new UnimplementedError();
+ }
+
+ void fillRange(int start, int end, [Element fillValue]) {
+ throw new UnimplementedError();
+ }
+
+ bool remove(Object object) {
+ if (object is Element) {
+ Element element = object;
+ // We aren't preserving identity of nodes in JSINTEROP mode
+ if (element.parentNode == _element) {
+ _element._removeChild(element);
+ return true;
+ }
+ }
+ return false;
+ }
+
+ void insert(int index, Element element) {
+ if (index < 0 || index > length) {
+ throw new RangeError.range(index, 0, length);
+ }
+ if (index == length) {
+ _element.append(element);
+ } else {
+ _element.insertBefore(element, this[index]);
+ }
+ }
+
+ void setAll(int index, Iterable<Element> iterable) {
+ throw new UnimplementedError();
+ }
+
+ void clear() {
+ _element._clearChildren();
+ }
+
+ Element removeAt(int index) {
+ final result = this[index];
+ if (result != null) {
+ _element._removeChild(result);
+ }
+ return result;
+ }
+
+ Element removeLast() {
+ final result = this.last;
+ if (result != null) {
+ _element._removeChild(result);
+ }
+ return result;
+ }
+
+ Element get first {
+ Element result = _element._firstElementChild;
+ if (result == null) throw new StateError("No elements");
+ return result;
+ }
+
+
+ Element get last {
+ Element result = _element._lastElementChild;
+ if (result == null) throw new StateError("No elements");
+ return result;
+ }
+
+ Element get single {
+ if (length > 1) throw new StateError("More than one element");
+ return first;
+ }
+
+ List<Node> get rawList => _childElements;
+}
+
+/**
+ * An immutable list containing HTML elements. This list contains some
+ * additional methods when compared to regular lists for ease of CSS
+ * manipulation on a group of elements.
+ */
+abstract class ElementList<T extends Element> extends ListBase<T> {
+ /**
+ * The union of all CSS classes applied to the elements in this list.
+ *
+ * This set makes it easy to add, remove or toggle (add if not present, remove
+ * if present) the classes applied to a collection of elements.
+ *
+ * htmlList.classes.add('selected');
+ * htmlList.classes.toggle('isOnline');
+ * htmlList.classes.remove('selected');
+ */
+ CssClassSet get classes;
+
+ /** Replace the classes with `value` for every element in this list. */
+ set classes(Iterable<String> value);
+
+ /**
+ * Access the union of all [CssStyleDeclaration]s that are associated with an
+ * [ElementList].
+ *
+ * Grouping the style objects all together provides easy editing of specific
+ * properties of a collection of elements. Setting a specific property value
+ * will set that property in all [Element]s in the [ElementList]. Getting a
+ * specific property value will return the value of the property of the first
+ * element in the [ElementList].
+ */
+ CssStyleDeclarationBase get style;
+
+ /**
+ * Access dimensions and position of the Elements in this list.
+ *
+ * Setting the height or width properties will set the height or width
+ * property for all elements in the list. This returns a rectangle with the
+ * dimenions actually available for content
+ * in this element, in pixels, regardless of this element's box-sizing
+ * property. Getting the height or width returns the height or width of the
+ * first Element in this list.
+ *
+ * Unlike [getBoundingClientRect], the dimensions of this rectangle
+ * will return the same numerical height if the element is hidden or not.
+ */
+ @Experimental()
+ CssRect get contentEdge;
+
+ /**
+ * Access dimensions and position of the first Element's content + padding box
+ * in this list.
+ *
+ * This returns a rectangle with the dimenions actually available for content
+ * in this element, in pixels, regardless of this element's box-sizing
+ * property. Unlike [getBoundingClientRect], the dimensions of this rectangle
+ * will return the same numerical height if the element is hidden or not. This
+ * can be used to retrieve jQuery's `innerHeight` value for an element. This
+ * is also a rectangle equalling the dimensions of clientHeight and
+ * clientWidth.
+ */
+ @Experimental()
+ CssRect get paddingEdge;
+
+ /**
+ * Access dimensions and position of the first Element's content + padding +
+ * border box in this list.
+ *
+ * This returns a rectangle with the dimenions actually available for content
+ * in this element, in pixels, regardless of this element's box-sizing
+ * property. Unlike [getBoundingClientRect], the dimensions of this rectangle
+ * will return the same numerical height if the element is hidden or not. This
+ * can be used to retrieve jQuery's `outerHeight` value for an element.
+ */
+ @Experimental()
+ CssRect get borderEdge;
+
+ /**
+ * Access dimensions and position of the first Element's content + padding +
+ * border + margin box in this list.
+ *
+ * This returns a rectangle with the dimenions actually available for content
+ * in this element, in pixels, regardless of this element's box-sizing
+ * property. Unlike [getBoundingClientRect], the dimensions of this rectangle
+ * will return the same numerical height if the element is hidden or not. This
+ * can be used to retrieve jQuery's `outerHeight` value for an element.
+ */
+ @Experimental()
+ CssRect get marginEdge;
+
+ /// Stream of `beforecopy` events handled by this [Element].
+ @DomName('Element.onbeforecopy')
+ @DocsEditable()
+ ElementStream<Event> get onBeforeCopy;
+
+ /// Stream of `beforecut` events handled by this [Element].
+ @DomName('Element.onbeforecut')
+ @DocsEditable()
+ ElementStream<Event> get onBeforeCut;
+
+ /// Stream of `beforepaste` events handled by this [Element].
+ @DomName('Element.onbeforepaste')
+ @DocsEditable()
+ ElementStream<Event> get onBeforePaste;
+
+ /// Stream of `copy` events handled by this [Element].
+ @DomName('Element.oncopy')
+ @DocsEditable()
+ ElementStream<Event> get onCopy;
+
+ /// Stream of `cut` events handled by this [Element].
+ @DomName('Element.oncut')
+ @DocsEditable()
+ ElementStream<Event> get onCut;
+
+ /// Stream of `paste` events handled by this [Element].
+ @DomName('Element.onpaste')
+ @DocsEditable()
+ ElementStream<Event> get onPaste;
+
+ /// Stream of `search` events handled by this [Element].
+ @DomName('Element.onsearch')
+ @DocsEditable()
+ // http://www.w3.org/TR/html-markup/input.search.html
+ @Experimental()
+ ElementStream<Event> get onSearch;
+
+ /// Stream of `selectstart` events handled by this [Element].
+ @DomName('Element.onselectstart')
+ @DocsEditable()
+ @Experimental() // nonstandard
+ ElementStream<Event> get onSelectStart;
+
+ /// Stream of `fullscreenchange` events handled by this [Element].
+ @DomName('Element.onwebkitfullscreenchange')
+ @DocsEditable()
+ // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
+ @Experimental()
+ ElementStream<Event> get onFullscreenChange;
+
+ /// Stream of `fullscreenerror` events handled by this [Element].
+ @DomName('Element.onwebkitfullscreenerror')
+ @DocsEditable()
+ // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
+ @Experimental()
+ ElementStream<Event> get onFullscreenError;
+
+}
+
+// Wrapper over an immutable NodeList to make it implement ElementList.
+//
+// Clients are {`Document`, `DocumentFragment`}.`querySelectorAll` which are
+// declared to return `ElementList`. This provides all the static analysis
+// benefit so there is no need for this class have a constrained type parameter.
+//
+class _FrozenElementList extends ListBase<Element>
+ implements ElementList<Element>, NodeListWrapper {
+ final List<Node> _nodeList;
+
+ var dartClass_instance;
+
+ _FrozenElementList._wrap(this._nodeList) {
+ this.dartClass_instance = this._nodeList;
+ }
+
+ int get length => _nodeList.length;
+
+ Element operator [](int index) => _nodeList[index];
+
+ void operator []=(int index, Element value) {
+ throw new UnsupportedError('Cannot modify list');
+ }
+
+ set length(int newLength) {
+ throw new UnsupportedError('Cannot modify list');
+ }
+
+ void sort([Comparator<Element> compare]) {
+ throw new UnsupportedError('Cannot sort list');
+ }
+
+ void shuffle([Random random]) {
+ throw new UnsupportedError('Cannot shuffle list');
+ }
+
+ Element get first => _nodeList.first;
+
+ Element get last => _nodeList.last;
+
+ Element get single => _nodeList.single;
+
+ CssClassSet get classes => new _MultiElementCssClassSet(this);
+
+ CssStyleDeclarationBase get style =>
+ new _CssStyleDeclarationSet(this);
+
+ set classes(Iterable<String> value) {
+ // TODO(sra): This might be faster for Sets:
+ //
+ // new _MultiElementCssClassSet(this).writeClasses(value)
+ //
+ // as the code below converts the Iterable[value] to a string multiple
+ // times. Maybe compute the string and set className here.
+ _nodeList.forEach((e) => e.classes = value);
+ }
+
+ CssRect get contentEdge => new _ContentCssListRect(this);
+
+ CssRect get paddingEdge => this.first.paddingEdge;
+
+ CssRect get borderEdge => this.first.borderEdge;
+
+ CssRect get marginEdge => this.first.marginEdge;
+
+ List<Node> get rawList => _nodeList;
+
+
+ /// Stream of `beforecopy` events handled by this [Element].
+ @DomName('Element.onbeforecopy')
+ @DocsEditable()
+ ElementStream<Event> get onBeforeCopy => Element.beforeCopyEvent._forElementList(this);
+
+ /// Stream of `beforecut` events handled by this [Element].
+ @DomName('Element.onbeforecut')
+ @DocsEditable()
+ ElementStream<Event> get onBeforeCut => Element.beforeCutEvent._forElementList(this);
+
+ /// Stream of `beforepaste` events handled by this [Element].
+ @DomName('Element.onbeforepaste')
+ @DocsEditable()
+ ElementStream<Event> get onBeforePaste => Element.beforePasteEvent._forElementList(this);
+
+ /// Stream of `copy` events handled by this [Element].
+ @DomName('Element.oncopy')
+ @DocsEditable()
+ ElementStream<Event> get onCopy => Element.copyEvent._forElementList(this);
+
+ /// Stream of `cut` events handled by this [Element].
+ @DomName('Element.oncut')
+ @DocsEditable()
+ ElementStream<Event> get onCut => Element.cutEvent._forElementList(this);
+
+ /// Stream of `paste` events handled by this [Element].
+ @DomName('Element.onpaste')
+ @DocsEditable()
+ ElementStream<Event> get onPaste => Element.pasteEvent._forElementList(this);
+
+ /// Stream of `search` events handled by this [Element].
+ @DomName('Element.onsearch')
+ @DocsEditable()
+ // http://www.w3.org/TR/html-markup/input.search.html
+ @Experimental()
+ ElementStream<Event> get onSearch => Element.searchEvent._forElementList(this);
+
+ /// Stream of `selectstart` events handled by this [Element].
+ @DomName('Element.onselectstart')
+ @DocsEditable()
+ @Experimental() // nonstandard
+ ElementStream<Event> get onSelectStart => Element.selectStartEvent._forElementList(this);
+
+ /// Stream of `fullscreenchange` events handled by this [Element].
+ @DomName('Element.onwebkitfullscreenchange')
+ @DocsEditable()
+ // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
+ @Experimental()
+ ElementStream<Event> get onFullscreenChange => Element.fullscreenChangeEvent._forElementList(this);
+
+ /// Stream of `fullscreenerror` events handled by this [Element].
+ @DomName('Element.onwebkitfullscreenerror')
+ @DocsEditable()
+ // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
+ @Experimental()
+ ElementStream<Event> get onFullscreenError => Element.fullscreenErrorEvent._forElementList(this);
+
+}
+
+@DocsEditable()
+/**
+ * An abstract class, which all HTML elements extend.
+ */
+@DomName('Element')
+@Native("Element")
+class Element extends Node implements ParentNode, ChildNode {
+
+ /**
+ * Creates an HTML element from a valid fragment of HTML.
+ *
+ * var element = new Element.html('<div class="foo">content</div>');
+ *
+ * The HTML fragment should contain only one single root element, any
+ * leading or trailing text nodes will be removed.
+ *
+ * The HTML fragment is parsed as if it occurred within the context of a
+ * `<body>` tag, this means that special elements such as `<caption>` which
+ * must be parsed within the scope of a `<table>` element will be dropped. Use
+ * [createFragment] to parse contextual HTML fragments.
+ *
+ * Unless a validator is provided this will perform the default validation
+ * and remove all scriptable elements and attributes.
+ *
+ * See also:
+ *
+ * * [NodeValidator]
+ *
+ */
+ factory Element.html(String html,
+ {NodeValidator validator, NodeTreeSanitizer treeSanitizer}) {
+ var fragment = document.body.createFragment(html, validator: validator,
+ treeSanitizer: treeSanitizer);
+
+ return fragment.nodes.where((e) => e is Element).single;
+ }
+
+ /**
+ * Custom element creation constructor.
+ *
+ * This constructor is used by the DOM when a custom element has been
+ * created. It can only be invoked by subclasses of Element from
+ * that classes created constructor.
+ *
+ * class CustomElement extends Element {
+ * factory CustomElement() => new Element.tag('x-custom');
+ *
+ * CustomElement.created() : super.created() {
+ * // Perform any element initialization.
+ * }
+ * }
+ * document.registerElement('x-custom', CustomElement);
+ */
+ Element.created() : super._created();
+
+ /**
+ * Creates the HTML element specified by the tag name.
+ *
+ * This is similar to [Document.createElement].
+ * [tag] should be a valid HTML tag name. If [tag] is an unknown tag then
+ * this will create an [UnknownElement].
+ *
+ * var divElement = new Element.tag('div');
+ * print(divElement is DivElement); // 'true'
+ * var myElement = new Element.tag('unknownTag');
+ * print(myElement is UnknownElement); // 'true'
+ *
+ * For standard elements it is more preferable to use the type constructors:
+ * var element = new DivElement();
+ *
+ * See also:
+ *
+ * * [isTagSupported]
+ */
+ factory Element.tag(String tag, [String typeExtention]) =>
+ _ElementFactoryProvider.createElement_tag(tag, typeExtention);
+
+ /// Creates a new `<a>` element.
+ ///
+ /// This is identical to calling `new Element.tag('a')`.
+ factory Element.a() => new Element.tag('a');
+
+ /// Creates a new `<article>` element.
+ ///
+ /// This is identical to calling `new Element.tag('article')`.
+ factory Element.article() => new Element.tag('article');
+
+ /// Creates a new `<aside>` element.
+ ///
+ /// This is identical to calling `new Element.tag('aside')`.
+ factory Element.aside() => new Element.tag('aside');
+
+ /// Creates a new `<audio>` element.
+ ///
+ /// This is identical to calling `new Element.tag('audio')`.
+ factory Element.audio() => new Element.tag('audio');
+
+ /// Creates a new `<br>` element.
+ ///
+ /// This is identical to calling `new Element.tag('br')`.
+ factory Element.br() => new Element.tag('br');
+
+ /// Creates a new `<canvas>` element.
+ ///
+ /// This is identical to calling `new Element.tag('canvas')`.
+ factory Element.canvas() => new Element.tag('canvas');
+
+ /// Creates a new `<div>` element.
+ ///
+ /// This is identical to calling `new Element.tag('div')`.
+ factory Element.div() => new Element.tag('div');
+
+ /// Creates a new `<footer>` element.
+ ///
+ /// This is identical to calling `new Element.tag('footer')`.
+ factory Element.footer() => new Element.tag('footer');
+
+ /// Creates a new `<header>` element.
+ ///
+ /// This is identical to calling `new Element.tag('header')`.
+ factory Element.header() => new Element.tag('header');
+
+ /// Creates a new `<hr>` element.
+ ///
+ /// This is identical to calling `new Element.tag('hr')`.
+ factory Element.hr() => new Element.tag('hr');
+
+ /// Creates a new `<iframe>` element.
+ ///
+ /// This is identical to calling `new Element.tag('iframe')`.
+ factory Element.iframe() => new Element.tag('iframe');
+
+ /// Creates a new `<img>` element.
+ ///
+ /// This is identical to calling `new Element.tag('img')`.
+ factory Element.img() => new Element.tag('img');
+
+ /// Creates a new `<li>` element.
+ ///
+ /// This is identical to calling `new Element.tag('li')`.
+ factory Element.li() => new Element.tag('li');
+
+ /// Creates a new `<nav>` element.
+ ///
+ /// This is identical to calling `new Element.tag('nav')`.
+ factory Element.nav() => new Element.tag('nav');
+
+ /// Creates a new `<ol>` element.
+ ///
+ /// This is identical to calling `new Element.tag('ol')`.
+ factory Element.ol() => new Element.tag('ol');
+
+ /// Creates a new `<option>` element.
+ ///
+ /// This is identical to calling `new Element.tag('option')`.
+ factory Element.option() => new Element.tag('option');
+
+ /// Creates a new `<p>` element.
+ ///
+ /// This is identical to calling `new Element.tag('p')`.
+ factory Element.p() => new Element.tag('p');
+
+ /// Creates a new `<pre>` element.
+ ///
+ /// This is identical to calling `new Element.tag('pre')`.
+ factory Element.pre() => new Element.tag('pre');
+
+ /// Creates a new `<section>` element.
+ ///
+ /// This is identical to calling `new Element.tag('section')`.
+ factory Element.section() => new Element.tag('section');
+
+ /// Creates a new `<select>` element.
+ ///
+ /// This is identical to calling `new Element.tag('select')`.
+ factory Element.select() => new Element.tag('select');
+
+ /// Creates a new `<span>` element.
+ ///
+ /// This is identical to calling `new Element.tag('span')`.
+ factory Element.span() => new Element.tag('span');
+
+ /// Creates a new `<svg>` element.
+ ///
+ /// This is identical to calling `new Element.tag('svg')`.
+ factory Element.svg() => new Element.tag('svg');
+
+ /// Creates a new `<table>` element.
+ ///
+ /// This is identical to calling `new Element.tag('table')`.
+ factory Element.table() => new Element.tag('table');
+
+ /// Creates a new `<td>` element.
+ ///
+ /// This is identical to calling `new Element.tag('td')`.
+ factory Element.td() => new Element.tag('td');
+
+ /// Creates a new `<textarea>` element.
+ ///
+ /// This is identical to calling `new Element.tag('textarea')`.
+ factory Element.textarea() => new Element.tag('textarea');
+
+ /// Creates a new `<th>` element.
+ ///
+ /// This is identical to calling `new Element.tag('th')`.
+ factory Element.th() => new Element.tag('th');
+
+ /// Creates a new `<tr>` element.
+ ///
+ /// This is identical to calling `new Element.tag('tr')`.
+ factory Element.tr() => new Element.tag('tr');
+
+ /// Creates a new `<ul>` element.
+ ///
+ /// This is identical to calling `new Element.tag('ul')`.
+ factory Element.ul() => new Element.tag('ul');
+
+ /// Creates a new `<video>` element.
+ ///
+ /// This is identical to calling `new Element.tag('video')`.
+ factory Element.video() => new Element.tag('video');
+
+ /**
+ * All attributes on this element.
+ *
+ * Any modifications to the attribute map will automatically be applied to
+ * this element.
+ *
+ * This only includes attributes which are not in a namespace
+ * (such as 'xlink:href'), additional attributes can be accessed via
+ * [getNamespacedAttributes].
+ */
+ Map<String, String> get attributes => new _ElementAttributeMap(this);
+
+ set attributes(Map<String, String> value) {
+ Map<String, String> attributes = this.attributes;
+ attributes.clear();
+ for (String key in value.keys) {
+ attributes[key] = value[key];
+ }
+ }
+
+ /**
+ * List of the direct children of this element.
+ *
+ * This collection can be used to add and remove elements from the document.
+ *
+ * var item = new DivElement();
+ * item.text = 'Something';
+ * document.body.children.add(item) // Item is now displayed on the page.
+ * for (var element in document.body.children) {
+ * element.style.background = 'red'; // Turns every child of body red.
+ * }
+ */
+ List<Element> get children => new _ChildrenElementList._wrap(this);
+
+ set children(List<Element> value) {
+ // Copy list first since we don't want liveness during iteration.
+ List copy = new List.from(value);
+ var children = this.children;
+ children.clear();
+ children.addAll(copy);
+ }
+
+ /**
+ * Finds all descendent elements of this element that match the specified
+ * group of selectors.
+ *
+ * [selectors] should be a string using CSS selector syntax.
+ *
+ * var items = element.querySelectorAll('.itemClassName');
+ *
+ * For details about CSS selector syntax, see the
+ * [CSS selector specification](http://www.w3.org/TR/css3-selectors/).
+ */
+ @DomName('Element.querySelectorAll')
+ ElementList<Element> querySelectorAll(String selectors) =>
+ new _FrozenElementList._wrap(_querySelectorAll(selectors));
+
+ /**
+ * Alias for [querySelector]. Note this function is deprecated because its
+ * semantics will be changing in the future.
+ */
+ @deprecated
+ @DomName('Element.querySelector')
+ @Experimental()
+ Element query(String relativeSelectors) => querySelector(relativeSelectors);
+
+ /**
+ * Alias for [querySelectorAll]. Note this function is deprecated because its
+ * semantics will be changing in the future.
+ */
+ @deprecated
+ @DomName('Element.querySelectorAll')
+ @Experimental()
+ ElementList<Element> queryAll(String relativeSelectors) =>
+ querySelectorAll(relativeSelectors);
+
+ /**
+ * The set of CSS classes applied to this element.
+ *
+ * This set makes it easy to add, remove or toggle the classes applied to
+ * this element.
+ *
+ * element.classes.add('selected');
+ * element.classes.toggle('isOnline');
+ * element.classes.remove('selected');
+ */
+ CssClassSet get classes => new _ElementCssClassSet(this);
+
+ set classes(Iterable<String> value) {
+ // TODO(sra): Do this without reading the classes in clear() and addAll(),
+ // or writing the classes in clear().
+ CssClassSet classSet = classes;
+ classSet.clear();
+ classSet.addAll(value);
+ }
+
+ /**
+ * Allows access to all custom data attributes (data-*) set on this element.
+ *
+ * The keys for the map must follow these rules:
+ *
+ * * The name must not begin with 'xml'.
+ * * The name cannot contain a semi-colon (';').
+ * * The name cannot contain any capital letters.
+ *
+ * Any keys from markup will be converted to camel-cased keys in the map.
+ *
+ * For example, HTML specified as:
+ *
+ * <div data-my-random-value='value'></div>
+ *
+ * Would be accessed in Dart as:
+ *
+ * var value = element.dataset['myRandomValue'];
+ *
+ * See also:
+ *
+ * * [Custom data attributes](http://www.w3.org/TR/html5/global-attributes.html#custom-data-attribute)
+ */
+ Map<String, String> get dataset =>
+ new _DataAttributeMap(attributes);
+
+ set dataset(Map<String, String> value) {
+ final data = this.dataset;
+ data.clear();
+ for (String key in value.keys) {
+ data[key] = value[key];
+ }
+ }
+
+ /**
+ * Gets a map for manipulating the attributes of a particular namespace.
+ *
+ * This is primarily useful for SVG attributes such as xref:link.
+ */
+ Map<String, String> getNamespacedAttributes(String namespace) {
+ return new _NamespacedAttributeMap(this, namespace);
+ }
+
+ /**
+ * The set of all CSS values applied to this element, including inherited
+ * and default values.
+ *
+ * The computedStyle contains values that are inherited from other
+ * sources, such as parent elements or stylesheets. This differs from the
+ * [style] property, which contains only the values specified directly on this
+ * element.
+ *
+ * PseudoElement can be values such as `::after`, `::before`, `::marker`,
+ * `::line-marker`.
+ *
+ * See also:
+ *
+ * * [CSS Inheritance and Cascade](http://docs.webplatform.org/wiki/tutorials/inheritance_and_cascade)
+ * * [Pseudo-elements](http://docs.webplatform.org/wiki/css/selectors/pseudo-elements)
+ */
+ CssStyleDeclaration getComputedStyle([String pseudoElement]) {
+ if (pseudoElement == null) {
+ pseudoElement = '';
+ }
+ // TODO(jacobr): last param should be null, see b/5045788
+ return window._getComputedStyle(this, pseudoElement);
+ }
+
+ /**
+ * Gets the position of this element relative to the client area of the page.
+ */
+ Rectangle get client => new Rectangle(clientLeft, clientTop, clientWidth,
+ clientHeight);
+
+ /**
+ * Gets the offset of this element relative to its offsetParent.
+ */
+ Rectangle get offset => new Rectangle(offsetLeft, offsetTop, offsetWidth,
+ offsetHeight);
+
+ /**
+ * Adds the specified text after the last child of this element.
+ */
+ void appendText(String text) {
+ this.append(new Text(text));
+ }
+
+ /**
+ * Parses the specified text as HTML and adds the resulting node after the
+ * last child of this element.
+ */
+ void appendHtml(String text, {NodeValidator validator,
+ NodeTreeSanitizer treeSanitizer}) {
+ this.insertAdjacentHtml('beforeend', text, validator: validator,
+ treeSanitizer: treeSanitizer);
+ }
+
+ /**
+ * Checks to see if the tag name is supported by the current platform.
+ *
+ * The tag should be a valid HTML tag name.
+ */
+ static bool isTagSupported(String tag) {
+ var e = _ElementFactoryProvider.createElement_tag(tag, null);
+ return e is Element && !(JS('bool', '#.constructor.name == "HTMLUnknownElement"', e));
+ }
+
+ /**
+ * Called by the DOM when this element has been inserted into the live
+ * document.
+ *
+ * More information can be found in the
+ * [Custom Elements](http://w3c.github.io/webcomponents/spec/custom/#dfn-attached-callback)
+ * draft specification.
+ */
+ @Experimental()
+ void attached() {
+ // For the deprecation period, call the old callback.
+ enteredView();
+ }
+
+ /**
+ * Called by the DOM when this element has been removed from the live
+ * document.
+ *
+ * More information can be found in the
+ * [Custom Elements](http://w3c.github.io/webcomponents/spec/custom/#dfn-detached-callback)
+ * draft specification.
+ */
+ @Experimental()
+ void detached() {
+ // For the deprecation period, call the old callback.
+ leftView();
+ }
+
+ /** *Deprecated*: override [attached] instead. */
+ @Experimental()
+ @deprecated
+ void enteredView() {}
+
+ /** *Deprecated*: override [detached] instead. */
+ @Experimental()
+ @deprecated
+ void leftView() {}
+
+
+ /**
+ * Called by the DOM whenever an attribute on this has been changed.
+ */
+ void attributeChanged(String name, String oldValue, String newValue) {}
+
+ // Hooks to support custom WebComponents.
+
+ Element _xtag;
+
+ /**
+ * Experimental support for [web components][wc]. This field stores a
+ * reference to the component implementation. It was inspired by Mozilla's
+ * [x-tags][] project. Please note: in the future it may be possible to
+ * `extend Element` from your class, in which case this field will be
+ * deprecated.
+ *
+ * If xtag has not been set, it will simply return `this` [Element].
+ *
+ * [wc]: http://dvcs.w3.org/hg/webcomponents/raw-file/tip/explainer/index.html
+ * [x-tags]: http://x-tags.org/
+ */
+ // Note: return type is `dynamic` for convenience to suppress warnings when
+ // members of the component are used. The actual type is a subtype of Element.
+ get xtag => _xtag != null ? _xtag : this;
+
+ set xtag(Element value) {
+ _xtag = value;
+ }
+
+ @DomName('Element.localName')
+ @DocsEditable()
+ String get localName => _localName;
+
+ /**
+ * A URI that identifies the XML namespace of this element.
+ *
+ * `null` if no namespace URI is specified.
+ *
+ * ## Other resources
+ *
+ * * [Node.namespaceURI]
+ * (http://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-NodeNSname) from W3C.
+ */
+ @DomName('Element.namespaceUri')
+ String get namespaceUri => _namespaceUri;
+
+ /**
+ * The string representation of this element.
+ *
+ * This is equivalent to reading the [localName] property.
+ */
+ String toString() => localName;
+
+ /**
+ * Scrolls this element into view.
+ *
+ * Only one of of the alignment options may be specified at a time.
+ *
+ * If no options are specified then this will attempt to scroll the minimum
+ * amount needed to bring the element into view.
+ *
+ * Note that alignCenter is currently only supported on WebKit platforms. If
+ * alignCenter is specified but not supported then this will fall back to
+ * alignTop.
+ *
+ * See also:
+ *
+ * * [scrollIntoView](http://docs.webplatform.org/wiki/dom/methods/scrollIntoView)
+ * * [scrollIntoViewIfNeeded](http://docs.webplatform.org/wiki/dom/methods/scrollIntoViewIfNeeded)
+ */
+ void scrollIntoView([ScrollAlignment alignment]) {
+ var hasScrollIntoViewIfNeeded = true;
+ if (alignment == ScrollAlignment.TOP) {
+ this._scrollIntoView(true);
+ } else if (alignment == ScrollAlignment.BOTTOM) {
+ this._scrollIntoView(false);
+ } else if (hasScrollIntoViewIfNeeded) {
+ if (alignment == ScrollAlignment.CENTER) {
+ this._scrollIntoViewIfNeeded(true);
+ } else {
+ this._scrollIntoViewIfNeeded();
+ }
+ } else {
+ this._scrollIntoView();
+ }
+ }
+
+
+ /**
+ * Parses text as an HTML fragment and inserts it into the DOM at the
+ * specified location.
+ *
+ * The [where] parameter indicates where to insert the HTML fragment:
+ *
+ * * 'beforeBegin': Immediately before this element.
+ * * 'afterBegin': As the first child of this element.
+ * * 'beforeEnd': As the last child of this element.
+ * * 'afterEnd': Immediately after this element.
+ *
+ * var html = '<div class="something">content</div>';
+ * // Inserts as the first child
+ * document.body.insertAdjacentHtml('afterBegin', html);
+ * var createdElement = document.body.children[0];
+ * print(createdElement.classes[0]); // Prints 'something'
+ *
+ * See also:
+ *
+ * * [insertAdjacentText]
+ * * [insertAdjacentElement]
+ */
+ void insertAdjacentHtml(String where, String html, {NodeValidator validator,
+ NodeTreeSanitizer treeSanitizer}) {
+ if (treeSanitizer is _TrustedHtmlTreeSanitizer) {
+ _insertAdjacentHtml(where, html);
+ } else {
+ _insertAdjacentNode(where, createFragment(html,
+ validator: validator, treeSanitizer: treeSanitizer));
+ }
+ }
+
+ @JSName('insertAdjacentHTML')
+ void _insertAdjacentHtml(String where, String text) => JS('void', '#.insertAdjacentHTML(#,#)', this.raw, where, text);
+
+
+ void _insertAdjacentNode(String where, Node node) {
+ switch (where.toLowerCase()) {
+ case 'beforebegin':
+ this.parentNode.insertBefore(node, this);
+ break;
+ case 'afterbegin':
+ var first = this.nodes.length > 0 ? this.nodes[0] : null;
+ this.insertBefore(node, first);
+ break;
+ case 'beforeend':
+ this.append(node);
+ break;
+ case 'afterend':
+ this.parentNode.insertBefore(node, this.nextNode);
+ break;
+ default:
+ throw new ArgumentError("Invalid position ${where}");
+ }
+ }
+
+ bool matches(String selectors) => JS('bool', '#.matches(#)', this.raw, selectors);
+
+ /** Checks if this element or any of its parents match the CSS selectors. */
+ @Experimental()
+ bool matchesWithAncestors(String selectors) {
+ var elem = this;
+ do {
+ if (elem.matches(selectors)) return true;
+ elem = elem.parent;
+ } while(elem != null);
+ return false;
+ }
+
+
+ /**
+ * Access this element's content position.
+ *
+ * This returns a rectangle with the dimenions actually available for content
+ * in this element, in pixels, regardless of this element's box-sizing
+ * property. Unlike [getBoundingClientRect], the dimensions of this rectangle
+ * will return the same numerical height if the element is hidden or not.
+ *
+ * _Important_ _note_: use of this method _will_ perform CSS calculations that
+ * can trigger a browser reflow. Therefore, use of this property _during_ an
+ * animation frame is discouraged. See also:
+ * [Browser Reflow](https://developers.google.com/speed/articles/reflow)
+ */
+ @Experimental()
+ CssRect get contentEdge => new _ContentCssRect(this);
+
+ /**
+ * Access the dimensions and position of this element's content + padding box.
+ *
+ * This returns a rectangle with the dimenions actually available for content
+ * in this element, in pixels, regardless of this element's box-sizing
+ * property. Unlike [getBoundingClientRect], the dimensions of this rectangle
+ * will return the same numerical height if the element is hidden or not. This
+ * can be used to retrieve jQuery's
+ * [innerHeight](http://api.jquery.com/innerHeight/) value for an element.
+ * This is also a rectangle equalling the dimensions of clientHeight and
+ * clientWidth.
+ *
+ * _Important_ _note_: use of this method _will_ perform CSS calculations that
+ * can trigger a browser reflow. Therefore, use of this property _during_ an
+ * animation frame is discouraged. See also:
+ * [Browser Reflow](https://developers.google.com/speed/articles/reflow)
+ */
+ @Experimental()
+ CssRect get paddingEdge => new _PaddingCssRect(this);
+
+ /**
+ * Access the dimensions and position of this element's content + padding +
+ * border box.
+ *
+ * This returns a rectangle with the dimenions actually available for content
+ * in this element, in pixels, regardless of this element's box-sizing
+ * property. Unlike [getBoundingClientRect], the dimensions of this rectangle
+ * will return the same numerical height if the element is hidden or not. This
+ * can be used to retrieve jQuery's
+ * [outerHeight](http://api.jquery.com/outerHeight/) value for an element.
+ *
+ * _Important_ _note_: use of this method _will_ perform CSS calculations that
+ * can trigger a browser reflow. Therefore, use of this property _during_ an
+ * animation frame is discouraged. See also:
+ * [Browser Reflow](https://developers.google.com/speed/articles/reflow)
+ */
+ @Experimental()
+ CssRect get borderEdge => new _BorderCssRect(this);
+
+ /**
+ * Access the dimensions and position of this element's content + padding +
+ * border + margin box.
+ *
+ * This returns a rectangle with the dimenions actually available for content
+ * in this element, in pixels, regardless of this element's box-sizing
+ * property. Unlike [getBoundingClientRect], the dimensions of this rectangle
+ * will return the same numerical height if the element is hidden or not. This
+ * can be used to retrieve jQuery's
+ * [outerHeight](http://api.jquery.com/outerHeight/) value for an element.
+ *
+ * _Important_ _note_: use of this method will perform CSS calculations that
+ * can trigger a browser reflow. Therefore, use of this property _during_ an
+ * animation frame is discouraged. See also:
+ * [Browser Reflow](https://developers.google.com/speed/articles/reflow)
+ */
+ @Experimental()
+ CssRect get marginEdge => new _MarginCssRect(this);
+
+ /**
+ * Provides the coordinates of the element relative to the top of the
+ * document.
+ *
+ * This method is the Dart equivalent to jQuery's
+ * [offset](http://api.jquery.com/offset/) method.
+ */
+ @Experimental()
+ Point get documentOffset => offsetTo(document.documentElement);
+
+ /**
+ * Provides the offset of this element's [borderEdge] relative to the
+ * specified [parent].
+ *
+ * This is the Dart equivalent of jQuery's
+ * [position](http://api.jquery.com/position/) method. Unlike jQuery's
+ * position, however, [parent] can be any parent element of `this`,
+ * rather than only `this`'s immediate [offsetParent]. If the specified
+ * element is _not_ an offset parent or transitive offset parent to this
+ * element, an [ArgumentError] is thrown.
+ */
+ @Experimental()
+ Point offsetTo(Element parent) {
+ return Element._offsetToHelper(this, parent);
+ }
+
+ static Point _offsetToHelper(Element current, Element parent) {
+ // We're hopping from _offsetParent_ to offsetParent (not just parent), so
+ // offsetParent, "tops out" at BODY. But people could conceivably pass in
+ // the document.documentElement and I want it to return an absolute offset,
+ // so we have the special case checking for HTML.
+ bool sameAsParent = current == parent;
+ bool foundAsParent = sameAsParent || parent.tagName == 'HTML';
+ if (current == null || sameAsParent) {
+ if (foundAsParent) return new Point(0, 0);
+ throw new ArgumentError("Specified element is not a transitive offset "
+ "parent of this element.");
+ }
+ Element parentOffset = current.offsetParent;
+ Point p = Element._offsetToHelper(parentOffset, parent);
+ return new Point(p.x + current.offsetLeft, p.y + current.offsetTop);
+ }
+
+ static HtmlDocument _parseDocument;
+ static Range _parseRange;
+ static NodeValidatorBuilder _defaultValidator;
+ static _ValidatingTreeSanitizer _defaultSanitizer;
+
+ /**
+ * Create a DocumentFragment from the HTML fragment and ensure that it follows
+ * the sanitization rules specified by the validator or treeSanitizer.
+ *
+ * If the default validation behavior is too restrictive then a new
+ * NodeValidator should be created, either extending or wrapping a default
+ * validator and overriding the validation APIs.
+ *
+ * The treeSanitizer is used to walk the generated node tree and sanitize it.
+ * A custom treeSanitizer can also be provided to perform special validation
+ * rules but since the API is more complex to implement this is discouraged.
+ *
+ * The returned tree is guaranteed to only contain nodes and attributes which
+ * are allowed by the provided validator.
+ *
+ * See also:
+ *
+ * * [NodeValidator]
+ * * [NodeTreeSanitizer]
+ */
+ DocumentFragment createFragment(String html,
+ {NodeValidator validator, NodeTreeSanitizer treeSanitizer}) {
+ if (treeSanitizer == null) {
+ if (validator == null) {
+ if (_defaultValidator == null) {
+ _defaultValidator = new NodeValidatorBuilder.common();
+ }
+ validator = _defaultValidator;
+ }
+ if (_defaultSanitizer == null) {
+ _defaultSanitizer = new _ValidatingTreeSanitizer(validator);
+ } else {
+ _defaultSanitizer.validator = validator;
+ }
+ treeSanitizer = _defaultSanitizer;
+ } else if (validator != null) {
+ throw new ArgumentError(
+ 'validator can only be passed if treeSanitizer is null');
+ }
+
+ if (_parseDocument == null) {
+ _parseDocument = document.implementation.createHtmlDocument('');
+ _parseRange = _parseDocument.createRange();
+
+ // Workaround for Safari bug. Was also previously Chrome bug 229142
+ // - URIs are not resolved in new doc.
+ BaseElement base = _parseDocument.createElement('base');
+ base.href = document.baseUri;
+ _parseDocument.head.append(base);
+ }
+ var contextElement;
+ if (this is BodyElement) {
+ contextElement = _parseDocument.body;
+ } else {
+ contextElement = _parseDocument.createElement(tagName);
+ _parseDocument.body.append(contextElement);
+ }
+ var fragment;
+ if (Range.supportsCreateContextualFragment &&
+ _canBeUsedToCreateContextualFragment) {
+ _parseRange.selectNodeContents(contextElement);
+ fragment = _parseRange.createContextualFragment(html);
+ } else {
+ contextElement._innerHtml = html;
+
+ fragment = _parseDocument.createDocumentFragment();
+ while (contextElement.firstChild != null) {
+ fragment.append(contextElement.firstChild);
+ }
+ }
+ if (contextElement != _parseDocument.body) {
+ contextElement.remove();
+ }
+
+ treeSanitizer.sanitizeTree(fragment);
+ // Copy the fragment over to the main document (fix for 14184)
+ document.adoptNode(fragment);
+
+ return fragment;
+ }
+
+ /** Test if createContextualFragment is supported for this element type */
+ bool get _canBeUsedToCreateContextualFragment =>
+ !_cannotBeUsedToCreateContextualFragment;
+
+ /** Test if createContextualFragment is NOT supported for this element type */
+ bool get _cannotBeUsedToCreateContextualFragment =>
+ _tagsForWhichCreateContextualFragmentIsNotSupported.contains(tagName);
+
+ /**
+ * A hard-coded list of the tag names for which createContextualFragment
+ * isn't supported.
+ */
+ static const _tagsForWhichCreateContextualFragmentIsNotSupported =
+ const ['HEAD', 'AREA',
+ 'BASE', 'BASEFONT', 'BR', 'COL', 'COLGROUP', 'EMBED', 'FRAME', 'FRAMESET',
+ 'HR', 'IMAGE', 'IMG', 'INPUT', 'ISINDEX', 'LINK', 'META', 'PARAM',
+ 'SOURCE', 'STYLE', 'TITLE', 'WBR'];
+
+ /**
+ * Parses the HTML fragment and sets it as the contents of this element.
+ *
+ * This uses the default sanitization behavior to sanitize the HTML fragment,
+ * use [setInnerHtml] to override the default behavior.
+ */
+ set innerHtml(String html) {
+ this.setInnerHtml(html);
+ }
+
+ /**
+ * Parses the HTML fragment and sets it as the contents of this element.
+ * This ensures that the generated content follows the sanitization rules
+ * specified by the validator or treeSanitizer.
+ *
+ * If the default validation behavior is too restrictive then a new
+ * NodeValidator should be created, either extending or wrapping a default
+ * validator and overriding the validation APIs.
+ *
+ * The treeSanitizer is used to walk the generated node tree and sanitize it.
+ * A custom treeSanitizer can also be provided to perform special validation
+ * rules but since the API is more complex to implement this is discouraged.
+ *
+ * The resulting tree is guaranteed to only contain nodes and attributes which
+ * are allowed by the provided validator.
+ *
+ * See also:
+ *
+ * * [NodeValidator]
+ * * [NodeTreeSanitizer]
+ */
+ void setInnerHtml(String html,
+ {NodeValidator validator, NodeTreeSanitizer treeSanitizer}) {
+ text = null;
+ if (treeSanitizer is _TrustedHtmlTreeSanitizer) {
+ _innerHtml = html;
+ } else {
+ append(createFragment(
+ html, validator: validator, treeSanitizer: treeSanitizer));
+ }
+ }
+ String get innerHtml => _innerHtml;
+
+ /**
+ * This is an ease-of-use accessor for event streams which should only be
+ * used when an explicit accessor is not available.
+ */
+ ElementEvents get on => new ElementEvents(this);
+
+ /**
+ * Verify if any of the attributes that we use in the sanitizer look unexpected,
+ * possibly indicating DOM clobbering attacks.
+ *
+ * Those attributes are: attributes, lastChild, children, previousNode and tagName.
+ */
+ static bool _hasCorruptedAttributes(Element element) {
+ return JS('bool', r'''
+ (function(element) {
+ if (!(element.attributes instanceof NamedNodeMap)) {
+ return true;
+ }
+ var childNodes = element.childNodes;
+ if (element.lastChild &&
+ element.lastChild !== childNodes[childNodes.length -1]) {
+ return true;
+ }
+ if (element.children) { // On Safari, children can apparently be null.
+ if (!((element.children instanceof HTMLCollection) ||
+ (element.children instanceof NodeList))) {
+ return true;
+ }
+ }
+ var length = 0;
+ if (element.children) {
+ length = element.children.length;
+ }
+ for (var i = 0; i < length; i++) {
+ var child = element.children[i];
+ // On IE it seems like we sometimes don't see the clobbered attribute,
+ // perhaps as a result of an over-optimization. Also use another route
+ // to check of attributes, children, or lastChild are clobbered. It may
+ // seem silly to check children as we rely on children to do this iteration,
+ // but it seems possible that the access to children might see the real thing,
+ // allowing us to check for clobbering that may show up in other accesses.
+ if (child["id"] == 'attributes' || child["name"] == 'attributes' ||
+ child["id"] == 'lastChild' || child["name"] == 'lastChild' ||
+ child["id"] == 'children' || child["name"] == 'children') {
+ return true;
+ }
+ }
+ return false;
+ })(#)''',
+ element.raw
+);
+ }
+
+ /// A secondary check for corruption, needed on IE
+ static bool _hasCorruptedAttributesAdditionalCheck(Element element) {
+ return JS('bool', r'!(#.attributes instanceof NamedNodeMap)',
+ element.raw
+);
+ }
+
+ static String _safeTagName(element) {
+ String result = 'element tag unavailable';
+ try {
+ if (element.tagName is String) {
+ result = element.tagName;
+ }
+ } catch (e) {}
+ return result;
+ }
+
+ @DomName('Element.offsetHeight')
+ @DocsEditable()
+ int get offsetHeight => JS('num', '#.offsetHeight', this.raw).round();
+
+ @DomName('Element.offsetLeft')
+ @DocsEditable()
+ int get offsetLeft => JS('num', '#.offsetLeft', this.raw).round();
+
+ @DomName('Element.offsetTop')
+ @DocsEditable()
+ int get offsetTop => JS('num', '#.offsetTop', this.raw).round();
+
+ @DomName('Element.offsetWidth')
+ @DocsEditable()
+ int get offsetWidth => JS('num', '#.offsetWidth', this.raw).round();
+
+ @DomName('Element.clientHeight')
+ @DocsEditable()
+ int get clientHeight => JS('num', '#.clientHeight', this.raw).round();
+
+ @DomName('Element.clientLeft')
+ @DocsEditable()
+ int get clientLeft => JS('num', '#.clientLeft', this.raw).round();
+
+ @DomName('Element.clientTop')
+ @DocsEditable()
+ int get clientTop => JS('num', '#.clientTop', this.raw).round();
+
+ @DomName('Element.clientWidth')
+ @DocsEditable()
+ int get clientWidth => JS('num', '#.clientWidth', this.raw).round();
+
+ @DomName('Element.scrollHeight')
+ @DocsEditable()
+ int get scrollHeight => JS('num', '#.scrollHeight', this.raw).round();
+
+ @DomName('Element.scrollLeft')
+ @DocsEditable()
+ int get scrollLeft => JS('num', '#.scrollLeft', this.raw).round();
+
+ @DomName('Element.scrollLeft')
+ @DocsEditable()
+ set scrollLeft(int value) {
+ JS("void", "#.scrollLeft = #", this.raw, value.round());
+ }
+
+ @DomName('Element.scrollTop')
+ @DocsEditable()
+ int get scrollTop => JS('num', '#.scrollTop', this.raw).round();
+
+ @DomName('Element.scrollTop')
+ @DocsEditable()
+ set scrollTop(int value) {
+ JS("void", "#.scrollTop = #", this.raw, value.round());
+ }
+
+ @DomName('Element.scrollWidth')
+ @DocsEditable()
+ int get scrollWidth => JS('num', '#.scrollWidth', this.raw).round();
+
+ // To suppress missing implicit constructor warnings.
+ factory Element._() { throw new UnsupportedError("Not supported"); }
+
+ /**
+ * Static factory designed to expose `beforecopy` events to event
+ * handlers that are not necessarily instances of [Element].
+ *
+ * See [EventStreamProvider] for usage information.
+ */
+ @DomName('Element.beforecopyEvent')
+ @DocsEditable()
+ static const EventStreamProvider<Event> beforeCopyEvent = const EventStreamProvider<Event>('beforecopy');
+
+ /**
+ * Static factory designed to expose `beforecut` events to event
+ * handlers that are not necessarily instances of [Element].
+ *
+ * See [EventStreamProvider] for usage information.
+ */
+ @DomName('Element.beforecutEvent')
+ @DocsEditable()
+ static const EventStreamProvider<Event> beforeCutEvent = const EventStreamProvider<Event>('beforecut');
+
+ /**
+ * Static factory designed to expose `beforepaste` events to event
+ * handlers that are not necessarily instances of [Element].
+ *
+ * See [EventStreamProvider] for usage information.
+ */
+ @DomName('Element.beforepasteEvent')
+ @DocsEditable()
+ static const EventStreamProvider<Event> beforePasteEvent = const EventStreamProvider<Event>('beforepaste');
+
+ /**
+ * Static factory designed to expose `copy` events to event
+ * handlers that are not necessarily instances of [Element].
+ *
+ * See [EventStreamProvider] for usage information.
+ */
+ @DomName('Element.copyEvent')
+ @DocsEditable()
+ static const EventStreamProvider<Event> copyEvent = const EventStreamProvider<Event>('copy');
+
+ /**
+ * Static factory designed to expose `cut` events to event
+ * handlers that are not necessarily instances of [Element].
+ *
+ * See [EventStreamProvider] for usage information.
+ */
+ @DomName('Element.cutEvent')
+ @DocsEditable()
+ static const EventStreamProvider<Event> cutEvent = const EventStreamProvider<Event>('cut');
+
+ /**
+ * Static factory designed to expose `paste` events to event
+ * handlers that are not necessarily instances of [Element].
+ *
+ * See [EventStreamProvider] for usage information.
+ */
+ @DomName('Element.pasteEvent')
+ @DocsEditable()
+ static const EventStreamProvider<Event> pasteEvent = const EventStreamProvider<Event>('paste');
+
+ /**
+ * Static factory designed to expose `search` events to event
+ * handlers that are not necessarily instances of [Element].
+ *
+ * See [EventStreamProvider] for usage information.
+ */
+ @DomName('Element.searchEvent')
+ @DocsEditable()
+ // http://www.w3.org/TR/html-markup/input.search.html
+ @Experimental()
+ static const EventStreamProvider<Event> searchEvent = const EventStreamProvider<Event>('search');
+
+ /**
+ * Static factory designed to expose `selectstart` events to event
+ * handlers that are not necessarily instances of [Element].
+ *
+ * See [EventStreamProvider] for usage information.
+ */
+ @DomName('Element.selectstartEvent')
+ @DocsEditable()
+ @Experimental() // nonstandard
+ static const EventStreamProvider<Event> selectStartEvent = const EventStreamProvider<Event>('selectstart');
+
+ /**
+ * Static factory designed to expose `fullscreenchange` events to event
+ * handlers that are not necessarily instances of [Element].
+ *
+ * See [EventStreamProvider] for usage information.
+ */
+ @DomName('Element.webkitfullscreenchangeEvent')
+ @DocsEditable()
+ @SupportedBrowser(SupportedBrowser.CHROME)
+ @SupportedBrowser(SupportedBrowser.SAFARI)
+ @Experimental()
+ // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
+ static const EventStreamProvider<Event> fullscreenChangeEvent = const EventStreamProvider<Event>('webkitfullscreenchange');
+
+ /**
+ * Static factory designed to expose `fullscreenerror` events to event
+ * handlers that are not necessarily instances of [Element].
+ *
+ * See [EventStreamProvider] for usage information.
+ */
+ @DomName('Element.webkitfullscreenerrorEvent')
+ @DocsEditable()
+ @SupportedBrowser(SupportedBrowser.CHROME)
+ @SupportedBrowser(SupportedBrowser.SAFARI)
+ @Experimental()
+ // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
+ static const EventStreamProvider<Event> fullscreenErrorEvent = const EventStreamProvider<Event>('webkitfullscreenerror');
+
+
+ @Deprecated("Internal Use Only")
+ static Element internalCreateElement() {
+ return new Element.internal_();
+ }
+
+ @Deprecated("Internal Use Only")
+ Element.internal_() : super.internal_();
+
+
+ @DomName('Element.contentEditable')
+ @DocsEditable()
+ String get contentEditable => wrap_jso(JS("String", "#.contentEditable", this.raw));
+ @DomName('Element.contentEditable')
+ @DocsEditable()
+ void set contentEditable(String val) => JS("void", "#.contentEditable = #", this.raw, unwrap_jso(val));
+
+ @DomName('Element.contextMenu')
+ @DocsEditable()
+ @Experimental() // untriaged
+ HtmlElement get contextMenu => wrap_jso(JS("HtmlElement", "#.contextMenu", this.raw));
+ @DomName('Element.contextMenu')
+ @DocsEditable()
+ @Experimental() // untriaged
+ void set contextMenu(HtmlElement val) => JS("void", "#.contextMenu = #", this.raw, unwrap_jso(val));
+
+ @DomName('Element.dir')
+ @DocsEditable()
+ String get dir => wrap_jso(JS("String", "#.dir", this.raw));
+ @DomName('Element.dir')
+ @DocsEditable()
+ void set dir(String val) => JS("void", "#.dir = #", this.raw, unwrap_jso(val));
+
+ /**
+ * Indicates whether the element can be dragged and dropped.
+ *
+ * ## Other resources
+ *
+ * * [Drag and drop sample]
+ * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+ * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+ * from HTML5Rocks.
+ * * [Drag and drop specification]
+ * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+ * from WHATWG.
+ */
+ @DomName('Element.draggable')
+ @DocsEditable()
+ bool get draggable => wrap_jso(JS("bool", "#.draggable", this.raw));
+ /**
+ * Indicates whether the element can be dragged and dropped.
+ *
+ * ## Other resources
+ *
+ * * [Drag and drop sample]
+ * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+ * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+ * from HTML5Rocks.
+ * * [Drag and drop specification]
+ * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+ * from WHATWG.
+ */
+ @DomName('Element.draggable')
+ @DocsEditable()
+ void set draggable(bool val) => JS("void", "#.draggable = #", this.raw, unwrap_jso(val));
+
+ /**
+ * Indicates whether the element is not relevant to the page's current state.
+ *
+ * ## Other resources
+ *
+ * * [Hidden attribute specification]
+ * (http://www.whatwg.org/specs/web-apps/current-work/multipage/editing.html#the-hidden-attribute)
+ * from WHATWG.
+ */
+ @DomName('Element.hidden')
+ @DocsEditable()
+ bool get hidden => wrap_jso(JS("bool", "#.hidden", this.raw));
+ /**
+ * Indicates whether the element is not relevant to the page's current state.
+ *
+ * ## Other resources
+ *
+ * * [Hidden attribute specification]
+ * (http://www.whatwg.org/specs/web-apps/current-work/multipage/editing.html#the-hidden-attribute)
+ * from WHATWG.
+ */
+ @DomName('Element.hidden')
+ @DocsEditable()
+ void set hidden(bool val) => JS("void", "#.hidden = #", this.raw, unwrap_jso(val));
+
+ @DomName('Element.isContentEditable')
+ @DocsEditable()
+ bool get isContentEditable => wrap_jso(JS("bool", "#.isContentEditable", this.raw));
+
+ @DomName('Element.lang')
+ @DocsEditable()
+ String get lang => wrap_jso(JS("String", "#.lang", this.raw));
+ @DomName('Element.lang')
+ @DocsEditable()
+ void set lang(String val) => JS("void", "#.lang = #", this.raw, unwrap_jso(val));
+
+ @DomName('Element.spellcheck')
+ @DocsEditable()
+ // http://blog.whatwg.org/the-road-to-html-5-spellchecking
+ @Experimental() // nonstandard
+ bool get spellcheck => wrap_jso(JS("bool", "#.spellcheck", this.raw));
+ @DomName('Element.spellcheck')
+ @DocsEditable()
+ // http://blog.whatwg.org/the-road-to-html-5-spellchecking
+ @Experimental() // nonstandard
+ void set spellcheck(bool val) => JS("void", "#.spellcheck = #", this.raw, unwrap_jso(val));
+
+ @DomName('Element.tabIndex')
+ @DocsEditable()
+ int get tabIndex => wrap_jso(JS("int", "#.tabIndex", this.raw));
+ @DomName('Element.tabIndex')
+ @DocsEditable()
+ void set tabIndex(int val) => JS("void", "#.tabIndex = #", this.raw, unwrap_jso(val));
+
+ @DomName('Element.title')
+ @DocsEditable()
+ String get title => wrap_jso(JS("String", "#.title", this.raw));
+ @DomName('Element.title')
+ @DocsEditable()
+ void set title(String val) => JS("void", "#.title = #", this.raw, unwrap_jso(val));
+
+ /**
+ * Specifies whether this element's text content changes when the page is
+ * localized.
+ *
+ * ## Other resources
+ *
+ * * [The translate attribute]
+ * (http://www.whatwg.org/specs/web-apps/current-work/multipage/elements.html#the-translate-attribute)
+ * from WHATWG.
+ */
+ @DomName('Element.translate')
+ @DocsEditable()
+ // http://www.whatwg.org/specs/web-apps/current-work/multipage/elements.html#the-translate-attribute
+ @Experimental()
+ bool get translate => wrap_jso(JS("bool", "#.translate", this.raw));
+ /**
+ * Specifies whether this element's text content changes when the page is
+ * localized.
+ *
+ * ## Other resources
+ *
+ * * [The translate attribute]
+ * (http://www.whatwg.org/specs/web-apps/current-work/multipage/elements.html#the-translate-attribute)
+ * from WHATWG.
+ */
+ @DomName('Element.translate')
+ @DocsEditable()
+ // http://www.whatwg.org/specs/web-apps/current-work/multipage/elements.html#the-translate-attribute
+ @Experimental()
+ void set translate(bool val) => JS("void", "#.translate = #", this.raw, unwrap_jso(val));
+
+ @JSName('webkitdropzone')
+ /**
+ * A set of space-separated keywords that specify what kind of data this
+ * Element accepts on drop and what to do with that data.
+ *
+ * ## Other resources
+ *
+ * * [Drag and drop sample]
+ * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+ * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+ * from HTML5Rocks.
+ * * [Drag and drop specification]
+ * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+ * from WHATWG.
+ */
+ @DomName('Element.webkitdropzone')
+ @DocsEditable()
+ @SupportedBrowser(SupportedBrowser.CHROME)
+ @SupportedBrowser(SupportedBrowser.SAFARI)
+ @Experimental()
+ // http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#the-dropzone-attribute
+ String get dropzone => wrap_jso(JS("String", "#.webkitdropzone", this.raw));
+ @JSName('webkitdropzone')
+ /**
+ * A set of space-separated keywords that specify what kind of data this
+ * Element accepts on drop and what to do with that data.
+ *
+ * ## Other resources
+ *
+ * * [Drag and drop sample]
+ * (https://github.com/dart-lang/dart-samples/tree/master/web/html5/dnd/basics)
+ * based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)
+ * from HTML5Rocks.
+ * * [Drag and drop specification]
+ * (http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dnd)
+ * from WHATWG.
+ */
+ @DomName('Element.webkitdropzone')
+ @DocsEditable()
+ @SupportedBrowser(SupportedBrowser.CHROME)
+ @SupportedBrowser(SupportedBrowser.SAFARI)
+ @Experimental()
+ // http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#the-dropzone-attribute
+ void set dropzone(String val) => JS("void", "#.webkitdropzone = #", this.raw, unwrap_jso(val));
+
+ @DomName('Element.click')
+ @DocsEditable()
+ void click() {
+ _click_1();
+ return;
+ }
+ @JSName('click')
+ @DomName('Element.click')
+ @DocsEditable()
+ void _click_1() => wrap_jso(JS("void ", "#.raw.click()", this));
+
+ @JSName('attributes')
+ @DomName('Element.attributes')
+ @DocsEditable()
+ _NamedNodeMap get _attributes => wrap_jso(JS("_NamedNodeMap", "#.attributes", this.raw));
+
+ @DomName('Element.className')
+ @DocsEditable()
+ String get className => wrap_jso(JS("String", "#.className", this.raw));
+ @DomName('Element.className')
+ @DocsEditable()
+ void set className(String val) => JS("void", "#.className = #", this.raw, unwrap_jso(val));
+
+ @JSName('clientHeight')
+ @DomName('Element.clientHeight')
+ @DocsEditable()
+ int get _clientHeight => wrap_jso(JS("int", "#.clientHeight", this.raw));
+
+ @JSName('clientLeft')
+ @DomName('Element.clientLeft')
+ @DocsEditable()
+ int get _clientLeft => wrap_jso(JS("int", "#.clientLeft", this.raw));
+
+ @JSName('clientTop')
+ @DomName('Element.clientTop')
+ @DocsEditable()
+ int get _clientTop => wrap_jso(JS("int", "#.clientTop", this.raw));
+
+ @JSName('clientWidth')
+ @DomName('Element.clientWidth')
+ @DocsEditable()
+ int get _clientWidth => wrap_jso(JS("int", "#.clientWidth", this.raw));
+
+ @DomName('Element.id')
+ @DocsEditable()
+ String get id => wrap_jso(JS("String", "#.id", this.raw));
+ @DomName('Element.id')
+ @DocsEditable()
+ void set id(String val) => JS("void", "#.id = #", this.raw, unwrap_jso(val));
+
+ @JSName('innerHTML')
+ @DomName('Element.innerHTML')
+ @DocsEditable()
+ String get _innerHtml => wrap_jso(JS("String", "#.innerHTML", this.raw));
+ @JSName('innerHTML')
+ @DomName('Element.innerHTML')
+ @DocsEditable()
+ void set _innerHtml(String val) => JS("void", "#.innerHTML = #", this.raw, unwrap_jso(val));
+
+ // Use implementation from Node.
+ // final String _localName;
+
+ // Use implementation from Node.
+ // final String _namespaceUri;
+
+ @JSName('offsetHeight')
+ @DomName('Element.offsetHeight')
+ @DocsEditable()
+ int get _offsetHeight => wrap_jso(JS("int", "#.offsetHeight", this.raw));
+
+ @JSName('offsetLeft')
+ @DomName('Element.offsetLeft')
+ @DocsEditable()
+ int get _offsetLeft => wrap_jso(JS("int", "#.offsetLeft", this.raw));
+
+ @DomName('Element.offsetParent')
+ @DocsEditable()
+ Element get offsetParent => wrap_jso(JS("Element", "#.offsetParent", this.raw));
+
+ @JSName('offsetTop')
+ @DomName('Element.offsetTop')
+ @DocsEditable()
+ int get _offsetTop => wrap_jso(JS("int", "#.offsetTop", this.raw));
+
+ @JSName('offsetWidth')
+ @DomName('Element.offsetWidth')
+ @DocsEditable()
+ int get _offsetWidth => wrap_jso(JS("int", "#.offsetWidth", this.raw));
+
+ @JSName('outerHTML')
+ @DomName('Element.outerHTML')
+ @DocsEditable()
+ String get outerHtml => wrap_jso(JS("String", "#.outerHTML", this.raw));
+
+ @JSName('scrollHeight')
+ @DomName('Element.scrollHeight')
+ @DocsEditable()
+ int get _scrollHeight => wrap_jso(JS("int", "#.scrollHeight", this.raw));
+
+ @JSName('scrollLeft')
+ @DomName('Element.scrollLeft')
+ @DocsEditable()
+ num get _scrollLeft => wrap_jso(JS("num", "#.scrollLeft", this.raw));
+ @JSName('scrollLeft')
+ @DomName('Element.scrollLeft')
+ @DocsEditable()
+ void set _scrollLeft(num val) => JS("void", "#.scrollLeft = #", this.raw, unwrap_jso(val));
+
+ @JSName('scrollTop')
+ @DomName('Element.scrollTop')
+ @DocsEditable()
+ num get _scrollTop => wrap_jso(JS("num", "#.scrollTop", this.raw));
+ @JSName('scrollTop')
+ @DomName('Element.scrollTop')
+ @DocsEditable()
+ void set _scrollTop(num val) => JS("void", "#.scrollTop = #", this.raw, unwrap_jso(val));
+
+ @JSName('scrollWidth')
+ @DomName('Element.scrollWidth')
+ @DocsEditable()
+ int get _scrollWidth => wrap_jso(JS("int", "#.scrollWidth", this.raw));
+
+ @DomName('Element.style')
+ @DocsEditable()
+ CssStyleDeclaration get style => wrap_jso(JS("CssStyleDeclaration", "#.style", this.raw));
+
+ @DomName('Element.tagName')
+ @DocsEditable()
+ String get tagName => wrap_jso(JS("String", "#.tagName", this.raw));
+
+ @DomName('Element.blur')
+ @DocsEditable()
+ void blur() {
+ _blur_1();
+ return;
+ }
+ @JSName('blur')
+ @DomName('Element.blur')
+ @DocsEditable()
+ void _blur_1() => wrap_jso(JS("void ", "#.raw.blur()", this));
+
+ @DomName('Element.focus')
+ @DocsEditable()
+ void focus() {
+ _focus_1();
+ return;
+ }
+ @JSName('focus')
+ @DomName('Element.focus')
+ @DocsEditable()
+ void _focus_1() => wrap_jso(JS("void ", "#.raw.focus()", this));
+
+ @DomName('Element.getAttribute')
+ @DocsEditable()
+ @Experimental() // untriaged
+ String getAttribute(String name) {
+ return _getAttribute_1(name);
+ }
+ @JSName('getAttribute')
+ @DomName('Element.getAttribute')
+ @DocsEditable()
+ @Experimental() // untriaged
+ String _getAttribute_1(name) => wrap_jso(JS("String ", "#.raw.getAttribute(#)", this, unwrap_jso(name)));
+
+ @DomName('Element.getAttributeNS')
+ @DocsEditable()
+ @Experimental() // untriaged
+ String getAttributeNS(String namespaceURI, String localName) {
+ return _getAttributeNS_1(namespaceURI, localName);
+ }
+ @JSName('getAttributeNS')
+ @DomName('Element.getAttributeNS')
+ @DocsEditable()
+ @Experimental() // untriaged
+ String _getAttributeNS_1(namespaceURI, localName) => wrap_jso(JS("String ", "#.raw.getAttributeNS(#, #)", this, unwrap_jso(namespaceURI), unwrap_jso(localName)));
+
+ /**
+ * Returns the smallest bounding rectangle that encompasses this element's
+ * padding, scrollbar, and border.
+ *
+ * ## Other resources
+ *
+ * * [Element.getBoundingClientRect]
+ * (https://developer.mozilla.org/en-US/docs/Web/API/Element.getBoundingClientRect)
+ * from MDN.
+ * * [The getBoundingClientRect() method]
+ * (http://www.w3.org/TR/cssom-view/#the-getclientrects-and-getboundingclientrect-methods)
+ * from W3C.
+ */
+ @DomName('Element.getBoundingClientRect')
+ @DocsEditable()
+ Rectangle getBoundingClientRect() {
+ return _getBoundingClientRect_1();
+ }
+ @JSName('getBoundingClientRect')
+ /**
+ * Returns the smallest bounding rectangle that encompasses this element's
+ * padding, scrollbar, and border.
+ *
+ * ## Other resources
+ *
+ * * [Element.getBoundingClientRect]
+ * (https://developer.mozilla.org/en-US/docs/Web/API/Element.getBoundingClientRect)
+ * from MDN.
+ * * [The getBoundingClientRect() method]
+ * (http://www.w3.org/TR/cssom-view/#the-getclientrects-and-getboundingclientrect-methods)
+ * from W3C.
+ */
+ @DomName('Element.getBoundingClientRect')
+ @DocsEditable()
+ Rectangle _getBoundingClientRect_1() => wrap_jso(JS("Rectangle ", "#.raw.getBoundingClientRect()", this));
+
+ /**
+ * Returns a list of shadow DOM insertion points to which this element is
+ * distributed.
+ *
+ * ## Other resources
+ *
+ * * [Shadow DOM specification]
+ * (https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html)
+ * from W3C.
+ */
+ @DomName('Element.getDestinationInsertionPoints')
+ @DocsEditable()
+ @Experimental() // untriaged
+ @Returns('NodeList')
+ @Creates('NodeList')
+ NodeList getDestinationInsertionPoints() {
+ return _getDestinationInsertionPoints_1();
+ }
+ @JSName('getDestinationInsertionPoints')
+ /**
+ * Returns a list of shadow DOM insertion points to which this element is
+ * distributed.
+ *
+ * ## Other resources
+ *
+ * * [Shadow DOM specification]
+ * (https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html)
+ * from W3C.
+ */
+ @DomName('Element.getDestinationInsertionPoints')
+ @DocsEditable()
+ @Experimental() // untriaged
+ @Returns('NodeList')
+ @Creates('NodeList')
+ NodeList _getDestinationInsertionPoints_1() => wrap_jso(JS("NodeList ", "#.raw.getDestinationInsertionPoints()", this));
+
+ /**
+ * Returns a list of nodes with the given class name inside this element.
+ *
+ * ## Other resources
+ *
+ * * [getElementsByClassName]
+ * (https://developer.mozilla.org/en-US/docs/Web/API/document.getElementsByClassName)
+ * from MDN.
+ * * [DOM specification]
+ * (http://www.w3.org/TR/domcore/) from W3C.
+ */
+ @DomName('Element.getElementsByClassName')
+ @DocsEditable()
+ @Creates('NodeList|HtmlCollection')
+ @Returns('NodeList|HtmlCollection')
+ HtmlCollection getElementsByClassName(String classNames) {
+ return _getElementsByClassName_1(classNames);
+ }
+ @JSName('getElementsByClassName')
+ /**
+ * Returns a list of nodes with the given class name inside this element.
+ *
+ * ## Other resources
+ *
+ * * [getElementsByClassName]
+ * (https://developer.mozilla.org/en-US/docs/Web/API/document.getElementsByClassName)
+ * from MDN.
+ * * [DOM specification]
+ * (http://www.w3.org/TR/domcore/) from W3C.
+ */
+ @DomName('Element.getElementsByClassName')
+ @DocsEditable()
+ @Creates('NodeList|HtmlCollection')
+ @Returns('NodeList|HtmlCollection')
+ HtmlCollection _getElementsByClassName_1(classNames) => wrap_jso(JS("HtmlCollection ", "#.raw.getElementsByClassName(#)", this, unwrap_jso(classNames)));
+
+ @DomName('Element.getElementsByTagName')
+ @DocsEditable()
+ @Creates('NodeList|HtmlCollection')
+ @Returns('NodeList|HtmlCollection')
+ HtmlCollection _getElementsByTagName(String name) {
+ return _getElementsByTagName_1(name);
+ }
+ @JSName('getElementsByTagName')
+ @DomName('Element.getElementsByTagName')
+ @DocsEditable()
+ @Creates('NodeList|HtmlCollection')
+ @Returns('NodeList|HtmlCollection')
+ HtmlCollection _getElementsByTagName_1(name) => wrap_jso(JS("HtmlCollection ", "#.raw.getElementsByTagName(#)", this, unwrap_jso(name)));
+
+ @DomName('Element.hasAttribute')
+ @DocsEditable()
+ bool _hasAttribute(String name) {
+ return _hasAttribute_1(name);
+ }
+ @JSName('hasAttribute')
+ @DomName('Element.hasAttribute')
+ @DocsEditable()
+ bool _hasAttribute_1(name) => wrap_jso(JS("bool ", "#.raw.hasAttribute(#)", this, unwrap_jso(name)));
+
+ @DomName('Element.hasAttributeNS')
+ @DocsEditable()
+ bool _hasAttributeNS(String namespaceURI, String localName) {
+ return _hasAttributeNS_1(namespaceURI, localName);
+ }
+ @JSName('hasAttributeNS')
+ @DomName('Element.hasAttributeNS')
+ @DocsEditable()
+ bool _hasAttributeNS_1(namespaceURI, localName) => wrap_jso(JS("bool ", "#.raw.hasAttributeNS(#, #)", this, unwrap_jso(namespaceURI), unwrap_jso(localName)));
+
+ @DomName('Element.removeAttribute')
+ @DocsEditable()
+ void _removeAttribute(String name) {
+ _removeAttribute_1(name);
+ return;
+ }
+ @JSName('removeAttribute')
+ @DomName('Element.removeAttribute')
+ @DocsEditable()
+ void _removeAttribute_1(name) => wrap_jso(JS("void ", "#.raw.removeAttribute(#)", this, unwrap_jso(name)));
+
+ @DomName('Element.removeAttributeNS')
+ @DocsEditable()
+ void _removeAttributeNS(String namespaceURI, String localName) {
+ _removeAttributeNS_1(namespaceURI, localName);
+ return;
+ }
+ @JSName('removeAttributeNS')
+ @DomName('Element.removeAttributeNS')
+ @DocsEditable()
+ void _removeAttributeNS_1(namespaceURI, localName) => wrap_jso(JS("void ", "#.raw.removeAttributeNS(#, #)", this, unwrap_jso(namespaceURI), unwrap_jso(localName)));
+
+ @DomName('Element.requestFullscreen')
+ @DocsEditable()
+ @Experimental() // untriaged
+ void requestFullscreen() {
+ _requestFullscreen_1();
+ return;
+ }
+ @JSName('requestFullscreen')
+ @DomName('Element.requestFullscreen')
+ @DocsEditable()
+ @Experimental() // untriaged
+ void _requestFullscreen_1() => wrap_jso(JS("void ", "#.raw.requestFullscreen()", this));
+
+ @DomName('Element.requestPointerLock')
+ @DocsEditable()
+ @Experimental() // untriaged
+ void requestPointerLock() {
+ _requestPointerLock_1();
+ return;
+ }
+ @JSName('requestPointerLock')
+ @DomName('Element.requestPointerLock')
+ @DocsEditable()
+ @Experimental() // untriaged
+ void _requestPointerLock_1() => wrap_jso(JS("void ", "#.raw.requestPointerLock()", this));
+
+ @DomName('Element.scrollIntoView')
+ @DocsEditable()
+ void _scrollIntoView([bool alignWithTop]) {
+ if (alignWithTop != null) {
+ _scrollIntoView_1(alignWithTop);
+ return;
+ }
+ _scrollIntoView_2();
+ return;
+ }
+ @JSName('scrollIntoView')
+ @DomName('Element.scrollIntoView')
+ @DocsEditable()
+ void _scrollIntoView_1(alignWithTop) => wrap_jso(JS("void ", "#.raw.scrollIntoView(#)", this, unwrap_jso(alignWithTop)));
+ @JSName('scrollIntoView')
+ @DomName('Element.scrollIntoView')
+ @DocsEditable()
+ void _scrollIntoView_2() => wrap_jso(JS("void ", "#.raw.scrollIntoView()", this));
+
+ @DomName('Element.scrollIntoViewIfNeeded')
+ @DocsEditable()
+ // http://docs.webplatform.org/wiki/dom/methods/scrollIntoViewIfNeeded
+ @Experimental() // non-standard
+ void _scrollIntoViewIfNeeded([bool centerIfNeeded]) {
+ if (centerIfNeeded != null) {
+ _scrollIntoViewIfNeeded_1(centerIfNeeded);
+ return;
+ }
+ _scrollIntoViewIfNeeded_2();
+ return;
+ }
+ @JSName('scrollIntoViewIfNeeded')
+ @DomName('Element.scrollIntoViewIfNeeded')
+ @DocsEditable()
+ // http://docs.webplatform.org/wiki/dom/methods/scrollIntoViewIfNeeded
+ @Experimental() // non-standard
+ void _scrollIntoViewIfNeeded_1(centerIfNeeded) => wrap_jso(JS("void ", "#.raw.scrollIntoViewIfNeeded(#)", this, unwrap_jso(centerIfNeeded)));
+ @JSName('scrollIntoViewIfNeeded')
+ @DomName('Element.scrollIntoViewIfNeeded')
+ @DocsEditable()
+ // http://docs.webplatform.org/wiki/dom/methods/scrollIntoViewIfNeeded
+ @Experimental() // non-standard
+ void _scrollIntoViewIfNeeded_2() => wrap_jso(JS("void ", "#.raw.scrollIntoViewIfNeeded()", this));
+
+ @DomName('Element.setAttribute')
+ @DocsEditable()
+ void setAttribute(String name, String value) {
+ _setAttribute_1(name, value);
+ return;
+ }
+ @JSName('setAttribute')
+ @DomName('Element.setAttribute')
+ @DocsEditable()
+ void _setAttribute_1(name, value) => wrap_jso(JS("void ", "#.raw.setAttribute(#, #)", this, unwrap_jso(name), unwrap_jso(value)));
+
+ @DomName('Element.setAttributeNS')
+ @DocsEditable()
+ void setAttributeNS(String namespaceURI, String qualifiedName, String value) {
+ _setAttributeNS_1(namespaceURI, qualifiedName, value);
+ return;
+ }
+ @JSName('setAttributeNS')
+ @DomName('Element.setAttributeNS')
+ @DocsEditable()
+ void _setAttributeNS_1(namespaceURI, qualifiedName, value) => wrap_jso(JS("void ", "#.raw.setAttributeNS(#, #, #)", this, unwrap_jso(namespaceURI), unwrap_jso(qualifiedName), unwrap_jso(value)));
+
+ // From ChildNode
+
+ @DomName('Element.nextElementSibling')
+ @DocsEditable()
+ Element get nextElementSibling => wrap_jso(JS("Element", "#.nextElementSibling", this.raw));
+
+ @DomName('Element.previousElementSibling')
+ @DocsEditable()
+ Element get previousElementSibling => wrap_jso(JS("Element", "#.previousElementSibling", this.raw));
+
+ // From ParentNode
+
+ @JSName('childElementCount')
+ @DomName('Element.childElementCount')
+ @DocsEditable()
+ int get _childElementCount => wrap_jso(JS("int", "#.childElementCount", this.raw));
+
+ @JSName('children')
+ @DomName('Element.children')
+ @DocsEditable()
+ @Returns('HtmlCollection')
+ @Creates('HtmlCollection')
+ List<Node> get _children => wrap_jso(JS("List<Node>", "#.children", this.raw));
+
+ @JSName('firstElementChild')
+ @DomName('Element.firstElementChild')
+ @DocsEditable()
+ Element get _firstElementChild => wrap_jso(JS("Element", "#.firstElementChild", this.raw));
+
+ @JSName('lastElementChild')
+ @DomName('Element.lastElementChild')
+ @DocsEditable()
+ Element get _lastElementChild => wrap_jso(JS("Element", "#.lastElementChild", this.raw));
+
+ /**
+ * Finds the first descendant element of this element that matches the
+ * specified group of selectors.
+ *
+ * [selectors] should be a string using CSS selector syntax.
+ *
+ * // Gets the first descendant with the class 'classname'
+ * var element = element.querySelector('.className');
+ * // Gets the element with id 'id'
+ * var element = element.querySelector('#id');
+ * // Gets the first descendant [ImageElement]
+ * var img = element.querySelector('img');
+ *
+ * For details about CSS selector syntax, see the
+ * [CSS selector specification](http://www.w3.org/TR/css3-selectors/).
+ */
+ @DomName('Element.querySelector')
+ @DocsEditable()
+ Element querySelector(String selectors) {
+ return _querySelector_1(selectors);
+ }
+ @JSName('querySelector')
+ /**
+ * Finds the first descendant element of this element that matches the
+ * specified group of selectors.
+ *
+ * [selectors] should be a string using CSS selector syntax.
+ *
+ * // Gets the first descendant with the class 'classname'
+ * var element = element.querySelector('.className');
+ * // Gets the element with id 'id'
+ * var element = element.querySelector('#id');
+ * // Gets the first descendant [ImageElement]
+ * var img = element.querySelector('img');
+ *
+ * For details about CSS selector syntax, see the
+ * [CSS selector specification](http://www.w3.org/TR/css3-selectors/).
+ */
+ @DomName('Element.querySelector')
+ @DocsEditable()
+ Element _querySelector_1(selectors) => wrap_jso(JS("Element ", "#.raw.querySelector(#)", this, unwrap_jso(selectors)));
+
+ @DomName('Element.querySelectorAll')
+ @DocsEditable()
+ @Returns('NodeList')
+ @Creates('NodeList')
+ NodeList _querySelectorAll(String selectors) {
+ return _querySelectorAll_1(selectors);
+ }
+ @JSName('querySelectorAll')
+ @DomName('Element.querySelectorAll')
+ @DocsEditable()
+ @Returns('NodeList')
+ @Creates('NodeList')
+ NodeList _querySelectorAll_1(selectors) => wrap_jso(JS("NodeList ", "#.raw.querySelectorAll(#)", this, unwrap_jso(selectors)));
+
+ /// Stream of `beforecopy` events handled by this [Element].
+ @DomName('Element.onbeforecopy')
+ @DocsEditable()
+ ElementStream<Event> get onBeforeCopy => beforeCopyEvent.forElement(this);
+
+ /// Stream of `beforecut` events handled by this [Element].
+ @DomName('Element.onbeforecut')
+ @DocsEditable()
+ ElementStream<Event> get onBeforeCut => beforeCutEvent.forElement(this);
+
+ /// Stream of `beforepaste` events handled by this [Element].
+ @DomName('Element.onbeforepaste')
+ @DocsEditable()
+ ElementStream<Event> get onBeforePaste => beforePasteEvent.forElement(this);
+
+ /// Stream of `copy` events handled by this [Element].
+ @DomName('Element.oncopy')
+ @DocsEditable()
+ ElementStream<Event> get onCopy => copyEvent.forElement(this);
+
+ /// Stream of `cut` events handled by this [Element].
+ @DomName('Element.oncut')
+ @DocsEditable()
+ ElementStream<Event> get onCut => cutEvent.forElement(this);
+
+ /// Stream of `paste` events handled by this [Element].
+ @DomName('Element.onpaste')
+ @DocsEditable()
+ ElementStream<Event> get onPaste => pasteEvent.forElement(this);
+
+ /// Stream of `search` events handled by this [Element].
+ @DomName('Element.onsearch')
+ @DocsEditable()
+ // http://www.w3.org/TR/html-markup/input.search.html
+ @Experimental()
+ ElementStream<Event> get onSearch => searchEvent.forElement(this);
+
+ /// Stream of `selectstart` events handled by this [Element].
+ @DomName('Element.onselectstart')
+ @DocsEditable()
+ @Experimental() // nonstandard
+ ElementStream<Event> get onSelectStart => selectStartEvent.forElement(this);
+
+ /// Stream of `fullscreenchange` events handled by this [Element].
+ @DomName('Element.onwebkitfullscreenchange')
+ @DocsEditable()
+ // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
+ @Experimental()
+ ElementStream<Event> get onFullscreenChange => fullscreenChangeEvent.forElement(this);
+
+ /// Stream of `fullscreenerror` events handled by this [Element].
+ @DomName('Element.onwebkitfullscreenerror')
+ @DocsEditable()
+ // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
+ @Experimental()
+ ElementStream<Event> get onFullscreenError => fullscreenErrorEvent.forElement(this);
+
+}
+
+
+class _ElementFactoryProvider {
+
+ @DomName('Document.createElement')
+ static Element createElement_tag(String tag, String typeExtension) =>
+ document.createElement(tag, typeExtension);
+}
+
+
+/**
+ * Options for Element.scrollIntoView.
+ */
+class ScrollAlignment {
+ final _value;
+ const ScrollAlignment._internal(this._value);
+ toString() => 'ScrollAlignment.$_value';
+
+ /// Attempt to align the element to the top of the scrollable area.
+ static const TOP = const ScrollAlignment._internal('TOP');
+ /// Attempt to center the element in the scrollable area.
+ static const CENTER = const ScrollAlignment._internal('CENTER');
+ /// Attempt to align the element to the bottom of the scrollable area.
+ static const BOTTOM = const ScrollAlignment._internal('BOTTOM');
+}
+// 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.
+
+// WARNING: Do not edit - generated code.
+
+
+@DomName('Event')
+@Native("Event,InputEvent,ClipboardEvent")
+class Event extends DartHtmlDomObject {
+ // In JS, canBubble and cancelable are technically required parameters to
+ // init*Event. In practice, though, if they aren't provided they simply
+ // default to false (since that's Boolean(undefined)).
+ //
+ // Contrary to JS, we default canBubble and cancelable to true, since that's
+ // what people want most of the time anyway.
+ factory Event(String type,
+ {bool canBubble: true, bool cancelable: true}) {
+ return new Event.eventType('Event', type, canBubble: canBubble,
+ cancelable: cancelable);
+ }
+
+ /**
+ * Creates a new Event object of the specified type.
+ *
+ * This is analogous to document.createEvent.
+ * Normally events should be created via their constructors, if available.
+ *
+ * var e = new Event.type('MouseEvent', 'mousedown', true, true);
+ */
+ factory Event.eventType(String type, String name, {bool canBubble: true,
+ bool cancelable: true}) {
+ final Event e = document._createEvent(type);
+ e._initEvent(name, canBubble, cancelable);
+ return e;
+ }
+
+ /** The CSS selector involved with event delegation. */
+ String _selector;
+
+ /**
+ * A pointer to the element whose CSS selector matched within which an event
+ * was fired. If this Event was not associated with any Event delegation,
+ * accessing this value will throw an [UnsupportedError].
+ */
+ Element get matchingTarget {
+ if (_selector == null) {
+ throw new UnsupportedError('Cannot call matchingTarget if this Event did'
+ ' not arise as a result of event delegation.');
+ }
+ Element currentTarget = this.currentTarget;
+ Element target = this.target;
+ var matchedTarget;
+ do {
+ if (target.matches(_selector)) return target;
+ target = target.parent;
+ } while (target != null && target != currentTarget.parent);
+ throw new StateError('No selector matched for populating matchedTarget.');
+ }
+ // To suppress missing implicit constructor warnings.
+ factory Event._() { throw new UnsupportedError("Not supported"); }
+
+ @Deprecated("Internal Use Only")
+ static Event internalCreateEvent() {
+ return new Event.internal_();
+ }
+
+ @Deprecated("Internal Use Only")
+ Event.internal_() { }
+
+ bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+ int get hashCode => unwrap_jso(this).hashCode;
+
+ /**
+ * This event is being handled by the event target.
+ *
+ * ## Other resources
+ *
+ * * [Target phase] (http://www.w3.org/TR/DOM-Level-3-Events/#target-phase)
+ * from W3C.
+ */
+ @DomName('Event.AT_TARGET')
+ @DocsEditable()
+ static const int AT_TARGET = 2;
+
+ /**
+ * This event is bubbling up through the target's ancestors.
+ *
+ * ## Other resources
+ *
+ * * [Bubble phase] (http://www.w3.org/TR/DOM-Level-3-Events/#bubble-phase)
+ * from W3C.
+ */
+ @DomName('Event.BUBBLING_PHASE')
+ @DocsEditable()
+ static const int BUBBLING_PHASE = 3;
+
+ /**
+ * This event is propagating through the target's ancestors, starting from the
+ * document.
+ *
+ * ## Other resources
+ *
+ * * [Bubble phase] (http://www.w3.org/TR/DOM-Level-3-Events/#bubble-phase)
+ * from W3C.
+ */
+ @DomName('Event.CAPTURING_PHASE')
+ @DocsEditable()
+ static const int CAPTURING_PHASE = 1;
+
+ @DomName('Event.bubbles')
+ @DocsEditable()
+ bool get bubbles => wrap_jso(JS("bool", "#.bubbles", this.raw));
+
+ @DomName('Event.cancelable')
+ @DocsEditable()
+ bool get cancelable => wrap_jso(JS("bool", "#.cancelable", this.raw));
+
+ @DomName('Event.currentTarget')
+ @DocsEditable()
+ EventTarget get currentTarget => _convertNativeToDart_EventTarget(this._get_currentTarget);
+ @JSName('currentTarget')
+ @DomName('Event.currentTarget')
+ @DocsEditable()
+ @Creates('Null')
+ @Returns('EventTarget|=Object')
+ dynamic get _get_currentTarget => wrap_jso(JS("dynamic", "#.currentTarget", this.raw));
+
+ @DomName('Event.defaultPrevented')
+ @DocsEditable()
+ bool get defaultPrevented => wrap_jso(JS("bool", "#.defaultPrevented", this.raw));
+
+ @DomName('Event.eventPhase')
+ @DocsEditable()
+ int get eventPhase => wrap_jso(JS("int", "#.eventPhase", this.raw));
+
+ /**
+ * This event's path, taking into account shadow DOM.
+ *
+ * ## Other resources
+ *
+ * * [Shadow DOM extensions to Event]
+ * (http://w3c.github.io/webcomponents/spec/shadow/#extensions-to-event) from
+ * W3C.
+ */
+ @DomName('Event.path')
+ @DocsEditable()
+ // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#extensions-to-event
+ @Experimental()
+ @Returns('NodeList')
+ @Creates('NodeList')
+ List<Node> get path => wrap_jso(JS("List<Node>", "#.path", this.raw));
+
+ @DomName('Event.target')
+ @DocsEditable()
+ EventTarget get target => _convertNativeToDart_EventTarget(this._get_target);
+ @JSName('target')
+ @DomName('Event.target')
+ @DocsEditable()
+ @Creates('Node')
+ @Returns('EventTarget|=Object')
+ dynamic get _get_target => wrap_jso(JS("dynamic", "#.target", this.raw));
+
+ @DomName('Event.timeStamp')
+ @DocsEditable()
+ int get timeStamp => wrap_jso(JS("int", "#.timeStamp", this.raw));
+
+ @DomName('Event.type')
+ @DocsEditable()
+ String get type => wrap_jso(JS("String", "#.type", this.raw));
+
+ @DomName('Event.initEvent')
+ @DocsEditable()
+ void _initEvent(String eventTypeArg, bool canBubbleArg, bool cancelableArg) {
+ _initEvent_1(eventTypeArg, canBubbleArg, cancelableArg);
+ return;
+ }
+ @JSName('initEvent')
+ @DomName('Event.initEvent')
+ @DocsEditable()
+ void _initEvent_1(eventTypeArg, canBubbleArg, cancelableArg) => wrap_jso(JS("void ", "#.raw.initEvent(#, #, #)", this, unwrap_jso(eventTypeArg), unwrap_jso(canBubbleArg), unwrap_jso(cancelableArg)));
+
+ @DomName('Event.preventDefault')
+ @DocsEditable()
+ void preventDefault() {
+ _preventDefault_1();
+ return;
+ }
+ @JSName('preventDefault')
+ @DomName('Event.preventDefault')
+ @DocsEditable()
+ void _preventDefault_1() => wrap_jso(JS("void ", "#.raw.preventDefault()", this));
+
+ @DomName('Event.stopImmediatePropagation')
+ @DocsEditable()
+ void stopImmediatePropagation() {
+ _stopImmediatePropagation_1();
+ return;
+ }
+ @JSName('stopImmediatePropagation')
+ @DomName('Event.stopImmediatePropagation')
+ @DocsEditable()
+ void _stopImmediatePropagation_1() => wrap_jso(JS("void ", "#.raw.stopImmediatePropagation()", this));
+
+ @DomName('Event.stopPropagation')
+ @DocsEditable()
+ void stopPropagation() {
+ _stopPropagation_1();
+ return;
+ }
+ @JSName('stopPropagation')
+ @DomName('Event.stopPropagation')
+ @DocsEditable()
+ void _stopPropagation_1() => wrap_jso(JS("void ", "#.raw.stopPropagation()", this));
+
+}
+// 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.
+
+
+/**
+ * Base class that supports listening for and dispatching browser events.
+ *
+ * Normally events are accessed via the Stream getter:
+ *
+ * element.onMouseOver.listen((e) => print('Mouse over!'));
+ *
+ * To access bubbling events which are declared on one element, but may bubble
+ * up to another element type (common for MediaElement events):
+ *
+ * MediaElement.pauseEvent.forTarget(document.body).listen(...);
+ *
+ * To useCapture on events:
+ *
+ * Element.keyDownEvent.forTarget(element, useCapture: true).listen(...);
+ *
+ * Custom events can be declared as:
+ *
+ * class DataGenerator {
+ * static EventStreamProvider<Event> dataEvent =
+ * new EventStreamProvider('data');
+ * }
+ *
+ * Then listeners should access the event with:
+ *
+ * DataGenerator.dataEvent.forTarget(element).listen(...);
+ *
+ * Custom events can also be accessed as:
+ *
+ * element.on['some_event'].listen(...);
+ *
+ * This approach is generally discouraged as it loses the event typing and
+ * some DOM events may have multiple platform-dependent event names under the
+ * covers. By using the standard Stream getters you will get the platform
+ * specific event name automatically.
+ */
+class Events {
+ /* Raw event target. */
+ final EventTarget _ptr;
+
+ Events(this._ptr);
+
+ Stream operator [](String type) {
+ return new _EventStream(_ptr, type, false);
+ }
+}
+
+class ElementEvents extends Events {
+ /* Raw event target. */
+ static final webkitEvents = {
+ 'animationend' : 'webkitAnimationEnd',
+ 'animationiteration' : 'webkitAnimationIteration',
+ 'animationstart' : 'webkitAnimationStart',
+ 'fullscreenchange' : 'webkitfullscreenchange',
+ 'fullscreenerror' : 'webkitfullscreenerror',
+ 'keyadded' : 'webkitkeyadded',
+ 'keyerror' : 'webkitkeyerror',
+ 'keymessage' : 'webkitkeymessage',
+ 'needkey' : 'webkitneedkey',
+ 'pointerlockchange' : 'webkitpointerlockchange',
+ 'pointerlockerror' : 'webkitpointerlockerror',
+ 'resourcetimingbufferfull' : 'webkitresourcetimingbufferfull',
+ 'transitionend': 'webkitTransitionEnd',
+ 'speechchange' : 'webkitSpeechChange'
+ };
+
+ ElementEvents(Element ptr) : super(ptr);
+
+ Stream operator [](String type) {
+ if (webkitEvents.keys.contains(type.toLowerCase())) {
+ if (Device.isWebKit) {
+ return new _ElementEventStreamImpl(
+ _ptr, webkitEvents[type.toLowerCase()], false);
+ }
+ }
+ return new _ElementEventStreamImpl(_ptr, type, false);
+ }
+}
+
+/**
+ * Base class for all browser objects that support events.
+ *
+ * Use the [on] property to add, and remove events
+ * for compile-time type checks and a more concise API.
+ */
+@DomName('EventTarget')
+@Native("EventTarget")
+class EventTarget extends DartHtmlDomObject {
+
+ // Custom element created callback.
+ EventTarget._created();
+
+ /**
+ * This is an ease-of-use accessor for event streams which should only be
+ * used when an explicit accessor is not available.
+ */
+ Events get on => new Events(this);
+
+ void addEventListener(String type, EventListener listener, [bool useCapture]) {
+ // TODO(leafp): This check is avoid a bug in our dispatch code when
+ // listener is null. The browser treats this call as a no-op in this
+ // case, so it's fine to short-circuit it, but we should not have to.
+ if (listener != null) {
+ _addEventListener(type, listener, useCapture);
+ }
+ }
+
+ void removeEventListener(String type, EventListener listener, [bool useCapture]) {
+ // TODO(leafp): This check is avoid a bug in our dispatch code when
+ // listener is null. The browser treats this call as a no-op in this
+ // case, so it's fine to short-circuit it, but we should not have to.
+ if (listener != null) {
+ _removeEventListener(type, listener, useCapture);
+ }
+ }
+
+ // To suppress missing implicit constructor warnings.
+ factory EventTarget._() { throw new UnsupportedError("Not supported"); }
+
+ @Deprecated("Internal Use Only")
+ static EventTarget internalCreateEventTarget() {
+ return new EventTarget.internal_();
+ }
+
+ @Deprecated("Internal Use Only")
+ EventTarget.internal_() { }
+
+ bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+ int get hashCode => unwrap_jso(this).hashCode;
+
+ @DomName('EventTarget.addEventListener')
+ @DocsEditable()
+ void _addEventListener([String type, EventListener listener, bool useCapture]) {
+ if (useCapture != null) {
+ _addEventListener_1(type, listener, useCapture);
+ return;
+ }
+ if (listener != null) {
+ _addEventListener_2(type, listener);
+ return;
+ }
+ if (type != null) {
+ _addEventListener_3(type);
+ return;
+ }
+ _addEventListener_4();
+ return;
+ }
+ @JSName('addEventListener')
+ @DomName('EventTarget.addEventListener')
+ @DocsEditable()
+ void _addEventListener_1(type, EventListener listener, useCapture) => wrap_jso(JS("void ", "#.raw.addEventListener(#, #, #)", this, unwrap_jso(type), unwrap_jso(listener), unwrap_jso(useCapture)));
+ @JSName('addEventListener')
+ @DomName('EventTarget.addEventListener')
+ @DocsEditable()
+ void _addEventListener_2(type, EventListener listener) => wrap_jso(JS("void ", "#.raw.addEventListener(#, #)", this, unwrap_jso(type), unwrap_jso(listener)));
+ @JSName('addEventListener')
+ @DomName('EventTarget.addEventListener')
+ @DocsEditable()
+ void _addEventListener_3(type) => wrap_jso(JS("void ", "#.raw.addEventListener(#)", this, unwrap_jso(type)));
+ @JSName('addEventListener')
+ @DomName('EventTarget.addEventListener')
+ @DocsEditable()
+ void _addEventListener_4() => wrap_jso(JS("void ", "#.raw.addEventListener()", this));
+
+ @DomName('EventTarget.dispatchEvent')
+ @DocsEditable()
+ bool dispatchEvent(Event event) {
+ return _dispatchEvent_1(event);
+ }
+ @JSName('dispatchEvent')
+ @DomName('EventTarget.dispatchEvent')
+ @DocsEditable()
+ bool _dispatchEvent_1(Event event) => wrap_jso(JS("bool ", "#.raw.dispatchEvent(#)", this, unwrap_jso(event)));
+
+ @DomName('EventTarget.removeEventListener')
+ @DocsEditable()
+ void _removeEventListener([String type, EventListener listener, bool useCapture]) {
+ if (useCapture != null) {
+ _removeEventListener_1(type, listener, useCapture);
+ return;
+ }
+ if (listener != null) {
+ _removeEventListener_2(type, listener);
+ return;
+ }
+ if (type != null) {
+ _removeEventListener_3(type);
+ return;
+ }
+ _removeEventListener_4();
+ return;
+ }
+ @JSName('removeEventListener')
+ @DomName('EventTarget.removeEventListener')
+ @DocsEditable()
+ void _removeEventListener_1(type, EventListener listener, useCapture) => wrap_jso(JS("void ", "#.raw.removeEventListener(#, #, #)", this, unwrap_jso(type), unwrap_jso(listener), unwrap_jso(useCapture)));
+ @JSName('removeEventListener')
+ @DomName('EventTarget.removeEventListener')
+ @DocsEditable()
+ void _removeEventListener_2(type, EventListener listener) => wrap_jso(JS("void ", "#.raw.removeEventListener(#, #)", this, unwrap_jso(type), unwrap_jso(listener)));
+ @JSName('removeEventListener')
+ @DomName('EventTarget.removeEventListener')
+ @DocsEditable()
+ void _removeEventListener_3(type) => wrap_jso(JS("void ", "#.raw.removeEventListener(#)", this, unwrap_jso(type)));
+ @JSName('removeEventListener')
+ @DomName('EventTarget.removeEventListener')
+ @DocsEditable()
+ void _removeEventListener_4() => wrap_jso(JS("void ", "#.raw.removeEventListener()", this));
+
+}
+// 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.
+
+
+@DocsEditable()
+@DomName('HTMLHeadElement')
+@Native("HTMLHeadElement")
+class HeadElement extends HtmlElement {
+ // To suppress missing implicit constructor warnings.
+ factory HeadElement._() { throw new UnsupportedError("Not supported"); }
+
+ @DomName('HTMLHeadElement.HTMLHeadElement')
+ @DocsEditable()
+ factory HeadElement() => document.createElement("head");
+
+
+ @Deprecated("Internal Use Only")
+ static HeadElement internalCreateHeadElement() {
+ return new HeadElement.internal_();
+ }
+
+ @Deprecated("Internal Use Only")
+ HeadElement.internal_() : super.internal_();
+
+}
+// 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.
+
+
+@DomName('History')
+@Native("History")
+class History extends DartHtmlDomObject implements HistoryBase {
+
+ /**
+ * Checks if the State APIs are supported on the current platform.
+ *
+ * See also:
+ *
+ * * [pushState]
+ * * [replaceState]
+ * * [state]
+ */
+ static bool get supportsState => true;
+ // To suppress missing implicit constructor warnings.
+ factory History._() { throw new UnsupportedError("Not supported"); }
+
+ @Deprecated("Internal Use Only")
+ static History internalCreateHistory() {
+ return new History.internal_();
+ }
+
+ @Deprecated("Internal Use Only")
+ History.internal_() { }
+
+ bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+ int get hashCode => unwrap_jso(this).hashCode;
+
+ @DomName('History.length')
+ @DocsEditable()
+ int get length => wrap_jso(JS("int", "#.length", this.raw));
+
+ @DomName('History.state')
+ @DocsEditable()
+ dynamic get state => convertNativeToDart_SerializedScriptValue(this._get_state);
+ @JSName('state')
+ @DomName('History.state')
+ @DocsEditable()
+ @annotation_Creates_SerializedScriptValue
+ @annotation_Returns_SerializedScriptValue
+ dynamic get _get_state => wrap_jso(JS("dynamic", "#.state", this.raw));
+
+ @DomName('History.back')
+ @DocsEditable()
+ void back() {
+ _back_1();
+ return;
+ }
+ @JSName('back')
+ @DomName('History.back')
+ @DocsEditable()
+ void _back_1() => wrap_jso(JS("void ", "#.raw.back()", this));
+
+ @DomName('History.forward')
+ @DocsEditable()
+ void forward() {
+ _forward_1();
+ return;
+ }
+ @JSName('forward')
+ @DomName('History.forward')
+ @DocsEditable()
+ void _forward_1() => wrap_jso(JS("void ", "#.raw.forward()", this));
+
+ @DomName('History.go')
+ @DocsEditable()
+ void go(int distance) {
+ _go_1(distance);
+ return;
+ }
+ @JSName('go')
+ @DomName('History.go')
+ @DocsEditable()
+ void _go_1(distance) => wrap_jso(JS("void ", "#.raw.go(#)", this, unwrap_jso(distance)));
+
+ @DomName('History.pushState')
+ @DocsEditable()
+ @SupportedBrowser(SupportedBrowser.CHROME)
+ @SupportedBrowser(SupportedBrowser.FIREFOX)
+ @SupportedBrowser(SupportedBrowser.IE, '10')
+ @SupportedBrowser(SupportedBrowser.SAFARI)
+ void pushState(/*any*/ data, String title, [String url]) {
+ if (url != null) {
+ var data_1 = convertDartToNative_SerializedScriptValue(data);
+ _pushState_1(data_1, title, url);
+ return;
+ }
+ var data_1 = convertDartToNative_SerializedScriptValue(data);
+ _pushState_2(data_1, title);
+ return;
+ }
+ @JSName('pushState')
+ @DomName('History.pushState')
+ @DocsEditable()
+ @SupportedBrowser(SupportedBrowser.CHROME)
+ @SupportedBrowser(SupportedBrowser.FIREFOX)
+ @SupportedBrowser(SupportedBrowser.IE, '10')
+ @SupportedBrowser(SupportedBrowser.SAFARI)
+ void _pushState_1(data, title, url) => wrap_jso(JS("void ", "#.raw.pushState(#, #, #)", this, unwrap_jso(data), unwrap_jso(title), unwrap_jso(url)));
+ @JSName('pushState')
+ @DomName('History.pushState')
+ @DocsEditable()
+ @SupportedBrowser(SupportedBrowser.CHROME)
+ @SupportedBrowser(SupportedBrowser.FIREFOX)
+ @SupportedBrowser(SupportedBrowser.IE, '10')
+ @SupportedBrowser(SupportedBrowser.SAFARI)
+ void _pushState_2(data, title) => wrap_jso(JS("void ", "#.raw.pushState(#, #)", this, unwrap_jso(data), unwrap_jso(title)));
+
+ @DomName('History.replaceState')
+ @DocsEditable()
+ @SupportedBrowser(SupportedBrowser.CHROME)
+ @SupportedBrowser(SupportedBrowser.FIREFOX)
+ @SupportedBrowser(SupportedBrowser.IE, '10')
+ @SupportedBrowser(SupportedBrowser.SAFARI)
+ void replaceState(/*any*/ data, String title, [String url]) {
+ if (url != null) {
+ var data_1 = convertDartToNative_SerializedScriptValue(data);
+ _replaceState_1(data_1, title, url);
+ return;
+ }
+ var data_1 = convertDartToNative_SerializedScriptValue(data);
+ _replaceState_2(data_1, title);
+ return;
+ }
+ @JSName('replaceState')
+ @DomName('History.replaceState')
+ @DocsEditable()
+ @SupportedBrowser(SupportedBrowser.CHROME)
+ @SupportedBrowser(SupportedBrowser.FIREFOX)
+ @SupportedBrowser(SupportedBrowser.IE, '10')
+ @SupportedBrowser(SupportedBrowser.SAFARI)
+ void _replaceState_1(data, title, url) => wrap_jso(JS("void ", "#.raw.replaceState(#, #, #)", this, unwrap_jso(data), unwrap_jso(title), unwrap_jso(url)));
+ @JSName('replaceState')
+ @DomName('History.replaceState')
+ @DocsEditable()
+ @SupportedBrowser(SupportedBrowser.CHROME)
+ @SupportedBrowser(SupportedBrowser.FIREFOX)
+ @SupportedBrowser(SupportedBrowser.IE, '10')
+ @SupportedBrowser(SupportedBrowser.SAFARI)
+ void _replaceState_2(data, title) => wrap_jso(JS("void ", "#.raw.replaceState(#, #)", this, unwrap_jso(data), unwrap_jso(title)));
+}
+// 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.
+
+
+@DocsEditable()
+@DomName('HTMLCollection')
+@Native("HTMLCollection")
+class HtmlCollection extends DartHtmlDomObject with ListMixin<Node>, ImmutableListMixin<Node> implements JavaScriptIndexingBehavior, List<Node> {
+ // To suppress missing implicit constructor warnings.
+ factory HtmlCollection._() { throw new UnsupportedError("Not supported"); }
+
+ @Deprecated("Internal Use Only")
+ static HtmlCollection internalCreateHtmlCollection() {
+ return new HtmlCollection.internal_();
+ }
+
+ @Deprecated("Internal Use Only")
+ HtmlCollection.internal_() { }
+
+ bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+ int get hashCode => unwrap_jso(this).hashCode;
+
+ @DomName('HTMLCollection.length')
+ @DocsEditable()
+ int get length => wrap_jso(JS("int", "#.length", this.raw));
+
+ Node operator[](int index) {
+ if (JS("bool", "# >>> 0 !== # || # >= #", index,
+ index, index, length))
+ throw new RangeError.index(index, this);
+ return wrap_jso(JS("Node", "#[#]", this.raw, index));
+ }
+ void operator[]=(int index, Node value) {
+ throw new UnsupportedError("Cannot assign element of immutable List.");
+ }
+ // -- start List<Node> mixins.
+ // Node is the element type.
+
+
+ set length(int value) {
+ throw new UnsupportedError("Cannot resize immutable List.");
+ }
+
+ Node get first {
+ if (this.length > 0) {
+ return wrap_jso(JS('Node', '#[0]', this.raw));
+ }
+ throw new StateError("No elements");
+ }
+
+ Node get last {
+ int len = this.length;
+ if (len > 0) {
+ return wrap_jso(JS('Node', '#[#]', this.raw, len - 1));
+ }
+ throw new StateError("No elements");
+ }
+
+ Node get single {
+ int len = this.length;
+ if (len == 1) {
+ return wrap_jso(JS('Node', '#[0]', this.raw));
+ }
+ if (len == 0) throw new StateError("No elements");
+ throw new StateError("More than one element");
+ }
+
+ Node elementAt(int index) => this[index];
+ // -- end List<Node> mixins.
+
+ @DomName('HTMLCollection.item')
+ @DocsEditable()
+ Element item(int index) {
+ return _item_1(index);
+ }
+ @JSName('item')
+ @DomName('HTMLCollection.item')
+ @DocsEditable()
+ Element _item_1(index) => wrap_jso(JS("Element ", "#.raw.item(#)", this, unwrap_jso(index)));
+
+ @DomName('HTMLCollection.namedItem')
+ @DocsEditable()
+ Element namedItem(String name) {
+ return _namedItem_1(name);
+ }
+ @JSName('namedItem')
+ @DomName('HTMLCollection.namedItem')
+ @DocsEditable()
+ Element _namedItem_1(name) => wrap_jso(JS("Element ", "#.raw.namedItem(#)", this, unwrap_jso(name)));
+}
+// 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.
+
+// WARNING: Do not edit - generated code.
+
+
+@DomName('HTMLDocument')
+@Native("HTMLDocument")
+class HtmlDocument extends Document {
+ // To suppress missing implicit constructor warnings.
+ factory HtmlDocument._() { throw new UnsupportedError("Not supported"); }
+
+
+ @Deprecated("Internal Use Only")
+ static HtmlDocument internalCreateHtmlDocument() {
+ return new HtmlDocument.internal_();
+ }
+
+ @Deprecated("Internal Use Only")
+ HtmlDocument.internal_() : super.internal_();
+
+
+
+ @DomName('Document.body')
+ BodyElement get body => _body;
+
+ @DomName('Document.body')
+ set body(BodyElement value) {
+ _body = value;
+ }
+
+ @DomName('Document.caretRangeFromPoint')
+ Range caretRangeFromPoint(int x, int y) {
+ return _caretRangeFromPoint(x, y);
+ }
+
+ @DomName('Document.elementFromPoint')
+ Element elementFromPoint(int x, int y) {
+ return _elementFromPoint(x, y);
+ }
+
+ /**
+ * Checks if the getCssCanvasContext API is supported on the current platform.
+ *
+ * See also:
+ *
+ * * [getCssCanvasContext]
+ */
+ static bool get supportsCssCanvasContext =>
+ JS('bool', '!!(document.getCSSCanvasContext)');
+
+
+ @DomName('Document.head')
+ HeadElement get head => _head;
+
+ @DomName('Document.lastModified')
+ String get lastModified => _lastModified;
+
+ @DomName('Document.preferredStylesheetSet')
+ String get preferredStylesheetSet => _preferredStylesheetSet;
+
+ @DomName('Document.referrer')
+ String get referrer => _referrer;
+
+ @DomName('Document.selectedStylesheetSet')
+ String get selectedStylesheetSet => _selectedStylesheetSet;
+ set selectedStylesheetSet(String value) {
+ _selectedStylesheetSet = value;
+ }
+
+
+ @DomName('Document.title')
+ String get title => _title;
+
+ @DomName('Document.title')
+ set title(String value) {
+ _title = value;
+ }
+
+ /**
+ * Returns page to standard layout.
+ *
+ * Has no effect if the page is not in fullscreen mode.
+ *
+ * ## Other resources
+ *
+ * * [Using the fullscreen API]
+ * (http://docs.webplatform.org/wiki/tutorials/using_the_full-screen_api) from
+ * WebPlatform.org.
+ * * [Fullscreen specification]
+ * (http://www.w3.org/TR/fullscreen/) from W3C.
+ */
+ @DomName('Document.webkitExitFullscreen')
+ @SupportedBrowser(SupportedBrowser.CHROME)
+ @SupportedBrowser(SupportedBrowser.SAFARI)
+ @Experimental()
+ void exitFullscreen() {
+ _webkitExitFullscreen();
+ }
+
+ /**
+ * Returns the element, if any, that is currently displayed in fullscreen.
+ *
+ * Returns null if there is currently no fullscreen element. You can use
+ * this to determine if the page is in fullscreen mode.
+ *
+ * myVideo = new VideoElement();
+ * if (document.fullscreenElement == null) {
+ * myVideo.requestFullscreen();
+ * print(document.fullscreenElement == myVideo); // true
+ * }
+ *
+ * ## Other resources
+ *
+ * * [Using the fullscreen API]
+ * (http://docs.webplatform.org/wiki/tutorials/using_the_full-screen_api) from
+ * WebPlatform.org.
+ * * [Fullscreen specification]
+ * (http://www.w3.org/TR/fullscreen/) from W3C.
+ */
+ @DomName('Document.webkitFullscreenElement')
+ @SupportedBrowser(SupportedBrowser.CHROME)
+ @SupportedBrowser(SupportedBrowser.SAFARI)
+ @Experimental()
+ Element get fullscreenElement => _webkitFullscreenElement;
+
+ /**
+ * Returns true if this document can display elements in fullscreen mode.
+ *
+ * ## Other resources
+ *
+ * * [Using the fullscreen API]
+ * (http://docs.webplatform.org/wiki/tutorials/using_the_full-screen_api) from
+ * WebPlatform.org.
+ * * [Fullscreen specification]
+ * (http://www.w3.org/TR/fullscreen/) from W3C.
+ */
+ @DomName('Document.webkitFullscreenEnabled')
+ @SupportedBrowser(SupportedBrowser.CHROME)
+ @SupportedBrowser(SupportedBrowser.SAFARI)
+ @Experimental()
+ bool get fullscreenEnabled => _webkitFullscreenEnabled;
+
+ @DomName('Document.webkitHidden')
+ @SupportedBrowser(SupportedBrowser.CHROME)
+ @SupportedBrowser(SupportedBrowser.SAFARI)
+ @Experimental()
+ bool get hidden => _webkitHidden;
+
+ @DomName('Document.visibilityState')
+ @SupportedBrowser(SupportedBrowser.CHROME)
+ @SupportedBrowser(SupportedBrowser.FIREFOX)
+ @SupportedBrowser(SupportedBrowser.IE, '10')
+ @Experimental()
+ String get visibilityState => _webkitVisibilityState;
+
+ @Experimental()
+ /**
+ * Register a custom subclass of Element to be instantiatable by the DOM.
+ *
+ * This is necessary to allow the construction of any custom elements.
+ *
+ * The class being registered must either subclass HtmlElement or SvgElement.
+ * If they subclass these directly then they can be used as:
+ *
+ * class FooElement extends HtmlElement{
+ * void created() {
+ * print('FooElement created!');
+ * }
+ * }
+ *
+ * main() {
+ * document.registerElement('x-foo', FooElement);
+ * var myFoo = new Element.tag('x-foo');
+ * // prints 'FooElement created!' to the console.
+ * }
+ *
+ * The custom element can also be instantiated via HTML using the syntax
+ * `<x-foo></x-foo>`
+ *
+ * Other elements can be subclassed as well:
+ *
+ * class BarElement extends InputElement{
+ * void created() {
+ * print('BarElement created!');
+ * }
+ * }
+ *
+ * main() {
+ * document.registerElement('x-bar', BarElement);
+ * var myBar = new Element.tag('input', 'x-bar');
+ * // prints 'BarElement created!' to the console.
+ * }
+ *
+ * This custom element can also be instantiated via HTML using the syntax
+ * `<input is="x-bar"></input>`
+ *
+ */
+ void registerElement(String tag, Type customElementClass,
+ {String extendsTag}) {
+ _registerCustomElement(JS('', 'window'), this, tag, customElementClass,
+ extendsTag);
+ }
+
+ /** *Deprecated*: use [registerElement] instead. */
+ @deprecated
+ @Experimental()
+ void register(String tag, Type customElementClass, {String extendsTag}) {
+ return registerElement(tag, customElementClass, extendsTag: extendsTag);
+ }
+
+ /**
+ * Static factory designed to expose `visibilitychange` events to event
+ * handlers that are not necessarily instances of [Document].
+ *
+ * See [EventStreamProvider] for usage information.
+ */
+ @DomName('Document.visibilityChange')
+ @SupportedBrowser(SupportedBrowser.CHROME)
+ @SupportedBrowser(SupportedBrowser.FIREFOX)
+ @SupportedBrowser(SupportedBrowser.IE, '10')
+ @Experimental()
+ static const EventStreamProvider<Event> visibilityChangeEvent =
+ const _CustomEventStreamProvider<Event>(
+ _determineVisibilityChangeEventType);
+
+ static String _determineVisibilityChangeEventType(EventTarget e) {
+ return 'webkitvisibilitychange';
+ }
+
+ @SupportedBrowser(SupportedBrowser.CHROME)
+ @SupportedBrowser(SupportedBrowser.FIREFOX)
+ @SupportedBrowser(SupportedBrowser.IE, '10')
+ @Experimental()
+ Stream<Event> get onVisibilityChange =>
+ visibilityChangeEvent.forTarget(this);
+
+ /// Creates an element upgrader which can be used to change the Dart wrapper
+ /// type for elements.
+ ///
+ /// The type specified must be a subclass of HtmlElement, when an element is
+ /// upgraded then the created constructor will be invoked on that element.
+ ///
+ /// If the type is not a direct subclass of HtmlElement then the extendsTag
+ /// parameter must be provided.
+ @Experimental()
+ ElementUpgrader createElementUpgrader(Type type, {String extendsTag}) {
+ throw 'ElementUpgrader not yet supported on DDC';
+ }
+}
+// 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.
+
+
+ /**
+ * A client-side XHR request for getting data from a URL,
+ * formally known as XMLHttpRequest.
+ *
+ * HttpRequest can be used to obtain data from HTTP and FTP protocols,
+ * and is useful for AJAX-style page updates.
+ *
+ * The simplest way to get the contents of a text file, such as a
+ * JSON-formatted file, is with [getString].
+ * For example, the following code gets the contents of a JSON file
+ * and prints its length:
+ *
+ * var path = 'myData.json';
+ * HttpRequest.getString(path)
+ * .then((String fileContents) {
+ * print(fileContents.length);
+ * })
+ * .catchError((Error error) {
+ * print(error.toString());
+ * });
+ *
+ * ## Fetching data from other servers
+ *
+ * For security reasons, browsers impose restrictions on requests
+ * made by embedded apps.
+ * With the default behavior of this class,
+ * the code making the request must be served from the same origin
+ * (domain name, port, and application layer protocol)
+ * as the requested resource.
+ * In the example above, the myData.json file must be co-located with the
+ * app that uses it.
+ * You might be able to
+ * [get around this restriction](http://www.dartlang.org/articles/json-web-service/#a-note-on-cors-and-httprequest)
+ * by using CORS headers or JSONP.
+ *
+ * ## Other resources
+ *
+ * * [Fetch Data Dynamically](https://www.dartlang.org/docs/tutorials/fetchdata/),
+ * a tutorial from _A Game of Darts_,
+ * shows two different ways to use HttpRequest to get a JSON file.
+ * * [Get Input from a Form](https://www.dartlang.org/docs/tutorials/forms/),
+ * another tutorial from _A Game of Darts_,
+ * shows using HttpRequest with a custom server.
+ * * [Dart article on using HttpRequests](http://www.dartlang.org/articles/json-web-service/#getting-data)
+ * * [JS XMLHttpRequest](https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest)
+ * * [Using XMLHttpRequest](https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest/Using_XMLHttpRequest)
+ */
+@DomName('XMLHttpRequest')
+@Native("XMLHttpRequest")
+class HttpRequest extends HttpRequestEventTarget {
+
+ /**
+ * Creates a GET request for the specified [url].
+ *
+ * The server response must be a `text/` mime type for this request to
+ * succeed.
+ *
+ * This is similar to [request] but specialized for HTTP GET requests which
+ * return text content.
+ *
+ * To add query parameters, append them to the [url] following a `?`,
+ * joining each key to its value with `=` and separating key-value pairs with
+ * `&`.
+ *
+ * var name = Uri.encodeQueryComponent('John');
+ * var id = Uri.encodeQueryComponent('42');
+ * HttpRequest.getString('users.json?name=$name&id=$id')
+ * .then((HttpRequest resp) {
+ * // Do something with the response.
+ * });
+ *
+ * See also:
+ *
+ * * [request]
+ */
+ static Future<String> getString(String url,
+ {bool withCredentials, void onProgress(ProgressEvent e)}) {
+ return request(url, withCredentials: withCredentials,
+ onProgress: onProgress).then((HttpRequest xhr) => xhr.responseText);
+ }
+
+ /**
+ * Makes a server POST request with the specified data encoded as form data.
+ *
+ * This is roughly the POST equivalent of getString. This method is similar
+ * to sending a FormData object with broader browser support but limited to
+ * String values.
+ *
+ * If [data] is supplied, the key/value pairs are URI encoded with
+ * [Uri.encodeQueryComponent] and converted into an HTTP query string.
+ *
+ * Unless otherwise specified, this method appends the following header:
+ *
+ * Content-Type: application/x-www-form-urlencoded; charset=UTF-8
+ *
+ * Here's an example of using this method:
+ *
+ * var data = { 'firstName' : 'John', 'lastName' : 'Doe' };
+ * HttpRequest.postFormData('/send', data).then((HttpRequest resp) {
+ * // Do something with the response.
+ * });
+ *
+ * See also:
+ *
+ * * [request]
+ */
+ static Future<HttpRequest> postFormData(String url, Map<String, String> data,
+ {bool withCredentials, String responseType,
+ Map<String, String> requestHeaders,
+ void onProgress(ProgressEvent e)}) {
+
+ var parts = [];
+ data.forEach((key, value) {
+ parts.add('${Uri.encodeQueryComponent(key)}='
+ '${Uri.encodeQueryComponent(value)}');
+ });
+ var formData = parts.join('&');
+
+ if (requestHeaders == null) {
+ requestHeaders = <String, String>{};
+ }
+ requestHeaders.putIfAbsent('Content-Type',
+ () => 'application/x-www-form-urlencoded; charset=UTF-8');
+
+ return request(url, method: 'POST', withCredentials: withCredentials,
+ responseType: responseType,
+ requestHeaders: requestHeaders, sendData: formData,
+ onProgress: onProgress);
+ }
+
+ /**
+ * Creates and sends a URL request for the specified [url].
+ *
+ * By default `request` will perform an HTTP GET request, but a different
+ * method (`POST`, `PUT`, `DELETE`, etc) can be used by specifying the
+ * [method] parameter. (See also [HttpRequest.postFormData] for `POST`
+ * requests only.
+ *
+ * The Future is completed when the response is available.
+ *
+ * If specified, `sendData` will send data in the form of a [ByteBuffer],
+ * [Blob], [Document], [String], or [FormData] along with the HttpRequest.
+ *
+ * If specified, [responseType] sets the desired response format for the
+ * request. By default it is [String], but can also be 'arraybuffer', 'blob',
+ * 'document', 'json', or 'text'. See also [HttpRequest.responseType]
+ * for more information.
+ *
+ * The [withCredentials] parameter specified that credentials such as a cookie
+ * (already) set in the header or
+ * [authorization headers](http://tools.ietf.org/html/rfc1945#section-10.2)
+ * should be specified for the request. Details to keep in mind when using
+ * credentials:
+ *
+ * * Using credentials is only useful for cross-origin requests.
+ * * The `Access-Control-Allow-Origin` header of `url` cannot contain a wildcard (*).
+ * * The `Access-Control-Allow-Credentials` header of `url` must be set to true.
+ * * If `Access-Control-Expose-Headers` has not been set to true, only a subset of all the response headers will be returned when calling [getAllRequestHeaders].
+ *
+ * The following is equivalent to the [getString] sample above:
+ *
+ * var name = Uri.encodeQueryComponent('John');
+ * var id = Uri.encodeQueryComponent('42');
+ * HttpRequest.request('users.json?name=$name&id=$id')
+ * .then((HttpRequest resp) {
+ * // Do something with the response.
+ * });
+ *
+ * Here's an example of submitting an entire form with [FormData].
+ *
+ * var myForm = querySelector('form#myForm');
+ * var data = new FormData(myForm);
+ * HttpRequest.request('/submit', method: 'POST', sendData: data)
+ * .then((HttpRequest resp) {
+ * // Do something with the response.
+ * });
+ *
+ * Note that requests for file:// URIs are only supported by Chrome extensions
+ * with appropriate permissions in their manifest. Requests to file:// URIs
+ * will also never fail- the Future will always complete successfully, even
+ * when the file cannot be found.
+ *
+ * See also: [authorization headers](http://en.wikipedia.org/wiki/Basic_access_authentication).
+ */
+ static Future<HttpRequest> request(String url,
+ {String method, bool withCredentials, String responseType,
+ String mimeType, Map<String, String> requestHeaders, sendData,
+ void onProgress(ProgressEvent e)}) {
+ var completer = new Completer<HttpRequest>();
+
+ var xhr = new HttpRequest();
+ if (method == null) {
+ method = 'GET';
+ }
+ xhr.open(method, url, async: true);
+
+ if (withCredentials != null) {
+ xhr.withCredentials = withCredentials;
+ }
+
+ if (responseType != null) {
+ xhr.responseType = responseType;
+ }
+
+ if (mimeType != null) {
+ xhr.overrideMimeType(mimeType);
+ }
+
+ if (requestHeaders != null) {
+ requestHeaders.forEach((header, value) {
+ xhr.setRequestHeader(header, value);
+ });
+ }
+
+ if (onProgress != null) {
+ xhr.onProgress.listen(onProgress);
+ }
+
+ xhr.onLoad.listen((e) {
+ var accepted = xhr.status >= 200 && xhr.status < 300;
+ var fileUri = xhr.status == 0; // file:// URIs have status of 0.
+ var notModified = xhr.status == 304;
+ // Redirect status is specified up to 307, but others have been used in
+ // practice. Notably Google Drive uses 308 Resume Incomplete for
+ // resumable uploads, and it's also been used as a redirect. The
+ // redirect case will be handled by the browser before it gets to us,
+ // so if we see it we should pass it through to the user.
+ var unknownRedirect = xhr.status > 307 && xhr.status < 400;
+
+ if (accepted || fileUri || notModified || unknownRedirect) {
+ completer.complete(xhr);
+ } else {
+ completer.completeError(e);
+ }
+ });
+
+ xhr.onError.listen(completer.completeError);
+
+ if (sendData != null) {
+ xhr.send(sendData);
+ } else {
+ xhr.send();
+ }
+
+ return completer.future;
+ }
+
+ /**
+ * Checks to see if the Progress event is supported on the current platform.
+ */
+ static bool get supportsProgressEvent {
+ return true;
+ }
+
+ /**
+ * Checks to see if the current platform supports making cross origin
+ * requests.
+ *
+ * Note that even if cross origin requests are supported, they still may fail
+ * if the destination server does not support CORS requests.
+ */
+ static bool get supportsCrossOrigin {
+ return true;
+ }
+
+ /**
+ * Checks to see if the LoadEnd event is supported on the current platform.
+ */
+ static bool get supportsLoadEndEvent {
+ return true;
+ }
+
+ /**
+ * Checks to see if the overrideMimeType method is supported on the current
+ * platform.
+ */
+ static bool get supportsOverrideMimeType {
+ return true;
+ }
+
+ /**
+ * Makes a cross-origin request to the specified URL.
+ *
+ * This API provides a subset of [request] which works on IE9. If IE9
+ * cross-origin support is not required then [request] should be used instead.
+ */
+ @Experimental()
+ static Future<String> requestCrossOrigin(String url,
+ {String method, String sendData}) {
+ if (supportsCrossOrigin) {
+ return request(url, method: method, sendData: sendData).then((xhr) {
+ return xhr.responseText;
+ });
+ }
+ }
+
+ /**
+ * Returns all response headers as a key-value map.
+ *
+ * Multiple values for the same header key can be combined into one,
+ * separated by a comma and a space.
+ *
+ * See: http://www.w3.org/TR/XMLHttpRequest/#the-getresponseheader()-method
+ */
+ Map<String, String> get responseHeaders {
+ // from Closure's goog.net.Xhrio.getResponseHeaders.
+ var headers = <String, String>{};
+ var headersString = this.getAllResponseHeaders();
+ if (headersString == null) {
+ return headers;
+ }
+ var headersList = headersString.split('\r\n');
+ for (var header in headersList) {
+ if (header.isEmpty) {
+ continue;
+ }
+
+ var splitIdx = header.indexOf(': ');
+ if (splitIdx == -1) {
+ continue;
+ }
+ var key = header.substring(0, splitIdx).toLowerCase();
+ var value = header.substring(splitIdx + 2);
+ if (headers.containsKey(key)) {
+ headers[key] = '${headers[key]}, $value';
+ } else {
+ headers[key] = value;
+ }
+ }
+ return headers;
+ }
+
+ /**
+ * Specify the desired `url`, and `method` to use in making the request.
+ *
+ * By default the request is done asyncronously, with no user or password
+ * authentication information. If `async` is false, the request will be send
+ * synchronously.
+ *
+ * Calling `open` again on a currently active request is equivalent to
+ * calling `abort`.
+ *
+ * Note: Most simple HTTP requests can be accomplished using the [getString],
+ * [request], [requestCrossOrigin], or [postFormData] methods. Use of this
+ * `open` method is intended only for more complext HTTP requests where
+ * finer-grained control is needed.
+ */
+ @DomName('XMLHttpRequest.open')
+ @DocsEditable()
+ void open(String method, String url, {bool async, String user, String password}) {
+ if (async == null && user == null && password == null) {
+ JS('void', '#.open(#, #)', this.raw, method, url);
+ } else {
+ JS('void', '#.open(#, #, #, #, #)', this.raw, method, url, async, user, password);
+ }
+ }
+
+ String get responseType => JS('String', '#.responseType', this.raw);
+ void set responseType(String value) { JS('void', '#.responseType = #', this.raw, value); }
+
+ // To suppress missing implicit constructor warnings.
+ factory HttpRequest._() { throw new UnsupportedError("Not supported"); }
+
+ /**
+ * Static factory designed to expose `readystatechange` events to event
+ * handlers that are not necessarily instances of [HttpRequest].
+ *
+ * See [EventStreamProvider] for usage information.
+ */
+ @DomName('XMLHttpRequest.readystatechangeEvent')
+ @DocsEditable()
+ static const EventStreamProvider<ProgressEvent> readyStateChangeEvent = const EventStreamProvider<ProgressEvent>('readystatechange');
+
+ /**
+ * General constructor for any type of request (GET, POST, etc).
+ *
+ * This call is used in conjunction with [open]:
+ *
+ * var request = new HttpRequest();
+ * request.open('GET', 'http://dartlang.org');
+ * request.onLoad.listen((event) => print(
+ * 'Request complete ${event.target.reponseText}'));
+ * request.send();
+ *
+ * is the (more verbose) equivalent of
+ *
+ * HttpRequest.getString('http://dartlang.org').then(
+ * (result) => print('Request complete: $result'));
+ */
+ @DomName('XMLHttpRequest.XMLHttpRequest')
+ @DocsEditable()
+ factory HttpRequest() {
+ return HttpRequest._create_1();
+ }
+ static HttpRequest _create_1() => wrap_jso(JS('HttpRequest', 'new XMLHttpRequest()'));
+
+
+ @Deprecated("Internal Use Only")
+ static HttpRequest internalCreateHttpRequest() {
+ return new HttpRequest.internal_();
+ }
+
+ @Deprecated("Internal Use Only")
+ HttpRequest.internal_() : super.internal_();
+
+
+ @DomName('XMLHttpRequest.DONE')
+ @DocsEditable()
+ static const int DONE = 4;
+
+ @DomName('XMLHttpRequest.HEADERS_RECEIVED')
+ @DocsEditable()
+ static const int HEADERS_RECEIVED = 2;
+
+ @DomName('XMLHttpRequest.LOADING')
+ @DocsEditable()
+ static const int LOADING = 3;
+
+ @DomName('XMLHttpRequest.OPENED')
+ @DocsEditable()
+ static const int OPENED = 1;
+
+ @DomName('XMLHttpRequest.UNSENT')
+ @DocsEditable()
+ static const int UNSENT = 0;
+
+ /**
+ * Indicator of the current state of the request:
+ *
+ * <table>
+ * <tr>
+ * <td>Value</td>
+ * <td>State</td>
+ * <td>Meaning</td>
+ * </tr>
+ * <tr>
+ * <td>0</td>
+ * <td>unsent</td>
+ * <td><code>open()</code> has not yet been called</td>
+ * </tr>
+ * <tr>
+ * <td>1</td>
+ * <td>opened</td>
+ * <td><code>send()</code> has not yet been called</td>
+ * </tr>
+ * <tr>
+ * <td>2</td>
+ * <td>headers received</td>
+ * <td><code>sent()</code> has been called; response headers and <code>status</code> are available</td>
+ * </tr>
+ * <tr>
+ * <td>3</td> <td>loading</td> <td><code>responseText</code> holds some data</td>
+ * </tr>
+ * <tr>
+ * <td>4</td> <td>done</td> <td>request is complete</td>
+ * </tr>
+ * </table>
+ */
+ @DomName('XMLHttpRequest.readyState')
+ @DocsEditable()
+ int get readyState => wrap_jso(JS("int", "#.readyState", this.raw));
+
+ /**
+ * The data received as a reponse from the request.
+ *
+ * The data could be in the
+ * form of a [String], [ByteBuffer], [Document], [Blob], or json (also a
+ * [String]). `null` indicates request failure.
+ */
+ @DomName('XMLHttpRequest.response')
+ @DocsEditable()
+ @SupportedBrowser(SupportedBrowser.CHROME)
+ @SupportedBrowser(SupportedBrowser.FIREFOX)
+ @SupportedBrowser(SupportedBrowser.IE, '10')
+ @SupportedBrowser(SupportedBrowser.SAFARI)
+ dynamic get response => _convertNativeToDart_XHR_Response(this._get_response);
+ @JSName('response')
+ /**
+ * The data received as a reponse from the request.
+ *
+ * The data could be in the
+ * form of a [String], [ByteBuffer], [Document], [Blob], or json (also a
+ * [String]). `null` indicates request failure.
+ */
+ @DomName('XMLHttpRequest.response')
+ @DocsEditable()
+ @SupportedBrowser(SupportedBrowser.CHROME)
+ @SupportedBrowser(SupportedBrowser.FIREFOX)
+ @SupportedBrowser(SupportedBrowser.IE, '10')
+ @SupportedBrowser(SupportedBrowser.SAFARI)
+ @Creates('NativeByteBuffer|Blob|Document|=Object|JSExtendableArray|String|num')
+ dynamic get _get_response => wrap_jso(JS("dynamic", "#.response", this.raw));
+
+ /**
+ * The response in String form or empty String on failure.
+ */
+ @DomName('XMLHttpRequest.responseText')
+ @DocsEditable()
+ String get responseText => wrap_jso(JS("String", "#.responseText", this.raw));
+
+ @JSName('responseURL')
+ @DomName('XMLHttpRequest.responseURL')
+ @DocsEditable()
+ @Experimental() // untriaged
+ String get responseUrl => wrap_jso(JS("String", "#.responseURL", this.raw));
+
+ @JSName('responseXML')
+ /**
+ * The request response, or null on failure.
+ *
+ * The response is processed as
+ * `text/xml` stream, unless responseType = 'document' and the request is
+ * synchronous.
+ */
+ @DomName('XMLHttpRequest.responseXML')
+ @DocsEditable()
+ Document get responseXml => wrap_jso(JS("Document", "#.responseXML", this.raw));
+
+ /**
+ * The http result code from the request (200, 404, etc).
+ * See also: [Http Status Codes](http://en.wikipedia.org/wiki/List_of_HTTP_status_codes)
+ */
+ @DomName('XMLHttpRequest.status')
+ @DocsEditable()
+ int get status => wrap_jso(JS("int", "#.status", this.raw));
+
+ /**
+ * The request response string (such as \"200 OK\").
+ * See also: [Http Status Codes](http://en.wikipedia.org/wiki/List_of_HTTP_status_codes)
+ */
+ @DomName('XMLHttpRequest.statusText')
+ @DocsEditable()
+ String get statusText => wrap_jso(JS("String", "#.statusText", this.raw));
+
+ /**
+ * Length of time before a request is automatically terminated.
+ *
+ * When the time has passed, a [TimeoutEvent] is dispatched.
+ *
+ * If [timeout] is set to 0, then the request will not time out.
+ *
+ * ## Other resources
+ *
+ * * [XMLHttpRequest.timeout]
+ * (https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest#timeout)
+ * from MDN.
+ * * [The timeout attribute]
+ * (http://www.w3.org/TR/XMLHttpRequest/#the-timeout-attribute)
+ * from W3C.
+ */
+ @DomName('XMLHttpRequest.timeout')
+ @DocsEditable()
+ @Experimental() // untriaged
+ int get timeout => wrap_jso(JS("int", "#.timeout", this.raw));
+ /**
+ * Length of time before a request is automatically terminated.
+ *
+ * When the time has passed, a [TimeoutEvent] is dispatched.
+ *
+ * If [timeout] is set to 0, then the request will not time out.
+ *
+ * ## Other resources
+ *
+ * * [XMLHttpRequest.timeout]
+ * (https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest#timeout)
+ * from MDN.
+ * * [The timeout attribute]
+ * (http://www.w3.org/TR/XMLHttpRequest/#the-timeout-attribute)
+ * from W3C.
+ */
+ @DomName('XMLHttpRequest.timeout')
+ @DocsEditable()
+ @Experimental() // untriaged
+ void set timeout(int val) => JS("void", "#.timeout = #", this.raw, unwrap_jso(val));
+
+ /**
+ * [EventTarget] that can hold listeners to track the progress of the request.
+ * The events fired will be members of [HttpRequestUploadEvents].
+ */
+ @DomName('XMLHttpRequest.upload')
+ @DocsEditable()
+ @Unstable()
+ HttpRequestEventTarget get upload => wrap_jso(JS("HttpRequestEventTarget", "#.upload", this.raw));
+
+ /**
+ * True if cross-site requests should use credentials such as cookies
+ * or authorization headers; false otherwise.
+ *
+ * This value is ignored for same-site requests.
+ */
+ @DomName('XMLHttpRequest.withCredentials')
+ @DocsEditable()
+ bool get withCredentials => wrap_jso(JS("bool", "#.withCredentials", this.raw));
+ /**
+ * True if cross-site requests should use credentials such as cookies
+ * or authorization headers; false otherwise.
+ *
+ * This value is ignored for same-site requests.
+ */
+ @DomName('XMLHttpRequest.withCredentials')
+ @DocsEditable()
+ void set withCredentials(bool val) => JS("void", "#.withCredentials = #", this.raw, unwrap_jso(val));
+
+ /**
+ * Stop the current request.
+ *
+ * The request can only be stopped if readyState is `HEADERS_RECIEVED` or
+ * `LOADING`. If this method is not in the process of being sent, the method
+ * has no effect.
+ */
+ @DomName('XMLHttpRequest.abort')
+ @DocsEditable()
+ void abort() {
+ _abort_1();
+ return;
+ }
+ @JSName('abort')
+ /**
+ * Stop the current request.
+ *
+ * The request can only be stopped if readyState is `HEADERS_RECIEVED` or
+ * `LOADING`. If this method is not in the process of being sent, the method
+ * has no effect.
+ */
+ @DomName('XMLHttpRequest.abort')
+ @DocsEditable()
+ void _abort_1() => wrap_jso(JS("void ", "#.raw.abort()", this));
+
+ /**
+ * Retrieve all the response headers from a request.
+ *
+ * `null` if no headers have been received. For multipart requests,
+ * `getAllResponseHeaders` will return the response headers for the current
+ * part of the request.
+ *
+ * See also [HTTP response headers](http://en.wikipedia.org/wiki/List_of_HTTP_header_fields#Responses)
+ * for a list of common response headers.
+ */
+ @DomName('XMLHttpRequest.getAllResponseHeaders')
+ @DocsEditable()
+ @Unstable()
+ String getAllResponseHeaders() {
+ return _getAllResponseHeaders_1();
+ }
+ @JSName('getAllResponseHeaders')
+ /**
+ * Retrieve all the response headers from a request.
+ *
+ * `null` if no headers have been received. For multipart requests,
+ * `getAllResponseHeaders` will return the response headers for the current
+ * part of the request.
+ *
+ * See also [HTTP response headers](http://en.wikipedia.org/wiki/List_of_HTTP_header_fields#Responses)
+ * for a list of common response headers.
+ */
+ @DomName('XMLHttpRequest.getAllResponseHeaders')
+ @DocsEditable()
+ @Unstable()
+ String _getAllResponseHeaders_1() => wrap_jso(JS("String ", "#.raw.getAllResponseHeaders()", this));
+
+ /**
+ * Return the response header named `header`, or null if not found.
+ *
+ * See also [HTTP response headers](http://en.wikipedia.org/wiki/List_of_HTTP_header_fields#Responses)
+ * for a list of common response headers.
+ */
+ @DomName('XMLHttpRequest.getResponseHeader')
+ @DocsEditable()
+ @Unstable()
+ String getResponseHeader(String header) {
+ return _getResponseHeader_1(header);
+ }
+ @JSName('getResponseHeader')
+ /**
+ * Return the response header named `header`, or null if not found.
+ *
+ * See also [HTTP response headers](http://en.wikipedia.org/wiki/List_of_HTTP_header_fields#Responses)
+ * for a list of common response headers.
+ */
+ @DomName('XMLHttpRequest.getResponseHeader')
+ @DocsEditable()
+ @Unstable()
+ String _getResponseHeader_1(header) => wrap_jso(JS("String ", "#.raw.getResponseHeader(#)", this, unwrap_jso(header)));
+
+ /**
+ * Specify a particular MIME type (such as `text/xml`) desired for the
+ * response.
+ *
+ * This value must be set before the request has been sent. See also the list
+ * of [common MIME types](http://en.wikipedia.org/wiki/Internet_media_type#List_of_common_media_types)
+ */
+ @DomName('XMLHttpRequest.overrideMimeType')
+ @DocsEditable()
+ @SupportedBrowser(SupportedBrowser.CHROME)
+ @SupportedBrowser(SupportedBrowser.FIREFOX)
+ @SupportedBrowser(SupportedBrowser.SAFARI)
+ void overrideMimeType(String override) {
+ _overrideMimeType_1(override);
+ return;
+ }
+ @JSName('overrideMimeType')
+ /**
+ * Specify a particular MIME type (such as `text/xml`) desired for the
+ * response.
+ *
+ * This value must be set before the request has been sent. See also the list
+ * of [common MIME types](http://en.wikipedia.org/wiki/Internet_media_type#List_of_common_media_types)
+ */
+ @DomName('XMLHttpRequest.overrideMimeType')
+ @DocsEditable()
+ @SupportedBrowser(SupportedBrowser.CHROME)
+ @SupportedBrowser(SupportedBrowser.FIREFOX)
+ @SupportedBrowser(SupportedBrowser.SAFARI)
+ void _overrideMimeType_1(override) => wrap_jso(JS("void ", "#.raw.overrideMimeType(#)", this, unwrap_jso(override)));
+
+ /**
+ * Send the request with any given `data`.
+ *
+ * Note: Most simple HTTP requests can be accomplished using the [getString],
+ * [request], [requestCrossOrigin], or [postFormData] methods. Use of this
+ * `send` method is intended only for more complext HTTP requests where
+ * finer-grained control is needed.
+ *
+ * ## Other resources
+ *
+ * * [XMLHttpRequest.send]
+ * (https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest#send%28%29)
+ * from MDN.
+ */
+ @DomName('XMLHttpRequest.send')
+ @DocsEditable()
+ void send([data]) {
+ if (data == null) {
+ _send_1();
+ return;
+ }
+ if ((data is Document || data == null)) {
+ _send_2(data);
+ return;
+ }
+ if ((data is String || data == null)) {
+ _send_3(data);
+ return;
+ }
+ throw new ArgumentError("Incorrect number or type of arguments");
+ }
+ @JSName('send')
+ /**
+ * Send the request with any given `data`.
+ *
+ * Note: Most simple HTTP requests can be accomplished using the [getString],
+ * [request], [requestCrossOrigin], or [postFormData] methods. Use of this
+ * `send` method is intended only for more complext HTTP requests where
+ * finer-grained control is needed.
+ *
+ * ## Other resources
+ *
+ * * [XMLHttpRequest.send]
+ * (https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest#send%28%29)
+ * from MDN.
+ */
+ @DomName('XMLHttpRequest.send')
+ @DocsEditable()
+ void _send_1() => wrap_jso(JS("void ", "#.raw.send()", this));
+ @JSName('send')
+ /**
+ * Send the request with any given `data`.
+ *
+ * Note: Most simple HTTP requests can be accomplished using the [getString],
+ * [request], [requestCrossOrigin], or [postFormData] methods. Use of this
+ * `send` method is intended only for more complext HTTP requests where
+ * finer-grained control is needed.
+ *
+ * ## Other resources
+ *
+ * * [XMLHttpRequest.send]
+ * (https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest#send%28%29)
+ * from MDN.
+ */
+ @DomName('XMLHttpRequest.send')
+ @DocsEditable()
+ void _send_2(Document data) => wrap_jso(JS("void ", "#.raw.send(#)", this, unwrap_jso(data)));
+ @JSName('send')
+ /**
+ * Send the request with any given `data`.
+ *
+ * Note: Most simple HTTP requests can be accomplished using the [getString],
+ * [request], [requestCrossOrigin], or [postFormData] methods. Use of this
+ * `send` method is intended only for more complext HTTP requests where
+ * finer-grained control is needed.
+ *
+ * ## Other resources
+ *
+ * * [XMLHttpRequest.send]
+ * (https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest#send%28%29)
+ * from MDN.
+ */
+ @DomName('XMLHttpRequest.send')
+ @DocsEditable()
+ void _send_3(String data) => wrap_jso(JS("void ", "#.raw.send(#)", this, unwrap_jso(data)));
+
+ /**
+ * Sets the value of an HTTP requst header.
+ *
+ * This method should be called after the request is opened, but before
+ * the request is sent.
+ *
+ * Multiple calls with the same header will combine all their values into a
+ * single header.
+ *
+ * ## Other resources
+ *
+ * * [XMLHttpRequest.setRequestHeader]
+ * (https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest#send%28%29)
+ * from MDN.
+ * * [The setRequestHeader() method]
+ * (http://www.w3.org/TR/XMLHttpRequest/#the-setrequestheader()-method) from
+ * W3C.
+ */
+ @DomName('XMLHttpRequest.setRequestHeader')
+ @DocsEditable()
+ void setRequestHeader(String header, String value) {
+ _setRequestHeader_1(header, value);
+ return;
+ }
+ @JSName('setRequestHeader')
+ /**
+ * Sets the value of an HTTP requst header.
+ *
+ * This method should be called after the request is opened, but before
+ * the request is sent.
+ *
+ * Multiple calls with the same header will combine all their values into a
+ * single header.
+ *
+ * ## Other resources
+ *
+ * * [XMLHttpRequest.setRequestHeader]
+ * (https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest#send%28%29)
+ * from MDN.
+ * * [The setRequestHeader() method]
+ * (http://www.w3.org/TR/XMLHttpRequest/#the-setrequestheader()-method) from
+ * W3C.
+ */
+ @DomName('XMLHttpRequest.setRequestHeader')
+ @DocsEditable()
+ void _setRequestHeader_1(header, value) => wrap_jso(JS("void ", "#.raw.setRequestHeader(#, #)", this, unwrap_jso(header), unwrap_jso(value)));
+
+ /// Stream of `readystatechange` events handled by this [HttpRequest].
+/**
+ * Event listeners to be notified every time the [HttpRequest]
+ * object's `readyState` changes values.
+ */
+ @DomName('XMLHttpRequest.onreadystatechange')
+ @DocsEditable()
+ Stream<ProgressEvent> get onReadyStateChange => readyStateChangeEvent.forTarget(this);
+
+}
+// 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.
+
+
+@DocsEditable()
+@DomName('XMLHttpRequestEventTarget')
+@Experimental() // untriaged
+@Native("XMLHttpRequestEventTarget")
+class HttpRequestEventTarget extends EventTarget {
+ // To suppress missing implicit constructor warnings.
+ factory HttpRequestEventTarget._() { throw new UnsupportedError("Not supported"); }
+
+ /**
+ * Static factory designed to expose `abort` events to event
+ * handlers that are not necessarily instances of [HttpRequestEventTarget].
+ *
+ * See [EventStreamProvider] for usage information.
+ */
+ @DomName('XMLHttpRequestEventTarget.abortEvent')
+ @DocsEditable()
+ @Experimental() // untriaged
+ static const EventStreamProvider<ProgressEvent> abortEvent = const EventStreamProvider<ProgressEvent>('abort');
+
+ /**
+ * Static factory designed to expose `error` events to event
+ * handlers that are not necessarily instances of [HttpRequestEventTarget].
+ *
+ * See [EventStreamProvider] for usage information.
+ */
+ @DomName('XMLHttpRequestEventTarget.errorEvent')
+ @DocsEditable()
+ @Experimental() // untriaged
+ static const EventStreamProvider<ProgressEvent> errorEvent = const EventStreamProvider<ProgressEvent>('error');
+
+ /**
+ * Static factory designed to expose `load` events to event
+ * handlers that are not necessarily instances of [HttpRequestEventTarget].
+ *
+ * See [EventStreamProvider] for usage information.
+ */
+ @DomName('XMLHttpRequestEventTarget.loadEvent')
+ @DocsEditable()
+ @Experimental() // untriaged
+ static const EventStreamProvider<ProgressEvent> loadEvent = const EventStreamProvider<ProgressEvent>('load');
+
+ /**
+ * Static factory designed to expose `loadend` events to event
+ * handlers that are not necessarily instances of [HttpRequestEventTarget].
+ *
+ * See [EventStreamProvider] for usage information.
+ */
+ @DomName('XMLHttpRequestEventTarget.loadendEvent')
+ @DocsEditable()
+ @Experimental() // untriaged
+ static const EventStreamProvider<ProgressEvent> loadEndEvent = const EventStreamProvider<ProgressEvent>('loadend');
+
+ /**
+ * Static factory designed to expose `loadstart` events to event
+ * handlers that are not necessarily instances of [HttpRequestEventTarget].
+ *
+ * See [EventStreamProvider] for usage information.
+ */
+ @DomName('XMLHttpRequestEventTarget.loadstartEvent')
+ @DocsEditable()
+ @Experimental() // untriaged
+ static const EventStreamProvider<ProgressEvent> loadStartEvent = const EventStreamProvider<ProgressEvent>('loadstart');
+
+ /**
+ * Static factory designed to expose `progress` events to event
+ * handlers that are not necessarily instances of [HttpRequestEventTarget].
+ *
+ * See [EventStreamProvider] for usage information.
+ */
+ @DomName('XMLHttpRequestEventTarget.progressEvent')
+ @DocsEditable()
+ @Experimental() // untriaged
+ static const EventStreamProvider<ProgressEvent> progressEvent = const EventStreamProvider<ProgressEvent>('progress');
+
+ /**
+ * Static factory designed to expose `timeout` events to event
+ * handlers that are not necessarily instances of [HttpRequestEventTarget].
+ *
+ * See [EventStreamProvider] for usage information.
+ */
+ @DomName('XMLHttpRequestEventTarget.timeoutEvent')
+ @DocsEditable()
+ @Experimental() // untriaged
+ static const EventStreamProvider<ProgressEvent> timeoutEvent = const EventStreamProvider<ProgressEvent>('timeout');
+
+
+ @Deprecated("Internal Use Only")
+ static HttpRequestEventTarget internalCreateHttpRequestEventTarget() {
+ return new HttpRequestEventTarget.internal_();
+ }
+
+ @Deprecated("Internal Use Only")
+ HttpRequestEventTarget.internal_() : super.internal_();
+
+
+ /// Stream of `abort` events handled by this [HttpRequestEventTarget].
+ @DomName('XMLHttpRequestEventTarget.onabort')
+ @DocsEditable()
+ @Experimental() // untriaged
+ Stream<ProgressEvent> get onAbort => abortEvent.forTarget(this);
+
+ /// Stream of `error` events handled by this [HttpRequestEventTarget].
+ @DomName('XMLHttpRequestEventTarget.onerror')
+ @DocsEditable()
+ @Experimental() // untriaged
+ Stream<ProgressEvent> get onError => errorEvent.forTarget(this);
+
+ /// Stream of `load` events handled by this [HttpRequestEventTarget].
+ @DomName('XMLHttpRequestEventTarget.onload')
+ @DocsEditable()
+ @Experimental() // untriaged
+ Stream<ProgressEvent> get onLoad => loadEvent.forTarget(this);
+
+ /// Stream of `loadend` events handled by this [HttpRequestEventTarget].
+ @DomName('XMLHttpRequestEventTarget.onloadend')
+ @DocsEditable()
+ @SupportedBrowser(SupportedBrowser.CHROME)
+ @SupportedBrowser(SupportedBrowser.FIREFOX)
+ @SupportedBrowser(SupportedBrowser.IE, '10')
+ @SupportedBrowser(SupportedBrowser.SAFARI)
+ @Experimental() // untriaged
+ Stream<ProgressEvent> get onLoadEnd => loadEndEvent.forTarget(this);
+
+ /// Stream of `loadstart` events handled by this [HttpRequestEventTarget].
+ @DomName('XMLHttpRequestEventTarget.onloadstart')
+ @DocsEditable()
+ @Experimental() // untriaged
+ Stream<ProgressEvent> get onLoadStart => loadStartEvent.forTarget(this);
+
+ /// Stream of `progress` events handled by this [HttpRequestEventTarget].
+ @DomName('XMLHttpRequestEventTarget.onprogress')
+ @DocsEditable()
+ @SupportedBrowser(SupportedBrowser.CHROME)
+ @SupportedBrowser(SupportedBrowser.FIREFOX)
+ @SupportedBrowser(SupportedBrowser.IE, '10')
+ @SupportedBrowser(SupportedBrowser.SAFARI)
+ @Experimental() // untriaged
+ Stream<ProgressEvent> get onProgress => progressEvent.forTarget(this);
+
+ /// Stream of `timeout` events handled by this [HttpRequestEventTarget].
+ @DomName('XMLHttpRequestEventTarget.ontimeout')
+ @DocsEditable()
+ @Experimental() // untriaged
+ Stream<ProgressEvent> get onTimeout => timeoutEvent.forTarget(this);
+}
+// 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.
+
+
+@DomName('HTMLInputElement')
+@Native("HTMLInputElement")
+class InputElement extends HtmlElement implements
+ HiddenInputElement,
+ SearchInputElement,
+ TextInputElement,
+ UrlInputElement,
+ TelephoneInputElement,
+ EmailInputElement,
+ PasswordInputElement,
+ DateInputElement,
+ MonthInputElement,
+ WeekInputElement,
+ TimeInputElement,
+ LocalDateTimeInputElement,
+ NumberInputElement,
+ RangeInputElement,
+ CheckboxInputElement,
+ RadioButtonInputElement,
+ FileUploadInputElement,
+ SubmitButtonInputElement,
+ ImageButtonInputElement,
+ ResetButtonInputElement,
+ ButtonInputElement {
+
+ factory InputElement({String type}) {
+ InputElement e = document.createElement("input");
+ if (type != null) {
+ try {
+ // IE throws an exception for unknown types.
+ e.type = type;
+ } catch(_) {}
+ }
+ return e;
+ }
+
+ // To suppress missing implicit constructor warnings.
+ factory InputElement._() { throw new UnsupportedError("Not supported"); }
+
+
+ @Deprecated("Internal Use Only")
+ static InputElement internalCreateInputElement() {
+ return new InputElement.internal_();
+ }
+
+ @Deprecated("Internal Use Only")
+ InputElement.internal_() : super.internal_();
+
+
+ @DomName('HTMLInputElement.accept')
+ @DocsEditable()
+ String get accept => wrap_jso(JS("String", "#.accept", this.raw));
+ @DomName('HTMLInputElement.accept')
+ @DocsEditable()
+ void set accept(String val) => JS("void", "#.accept = #", this.raw, unwrap_jso(val));
+
+ @DomName('HTMLInputElement.alt')
+ @DocsEditable()
+ String get alt => wrap_jso(JS("String", "#.alt", this.raw));
+ @DomName('HTMLInputElement.alt')
+ @DocsEditable()
+ void set alt(String val) => JS("void", "#.alt = #", this.raw, unwrap_jso(val));
+
+ @DomName('HTMLInputElement.autocomplete')
+ @DocsEditable()
+ String get autocomplete => wrap_jso(JS("String", "#.autocomplete", this.raw));
+ @DomName('HTMLInputElement.autocomplete')
+ @DocsEditable()
+ void set autocomplete(String val) => JS("void", "#.autocomplete = #", this.raw, unwrap_jso(val));
+
+ @DomName('HTMLInputElement.autofocus')
+ @DocsEditable()
+ bool get autofocus => wrap_jso(JS("bool", "#.autofocus", this.raw));
+ @DomName('HTMLInputElement.autofocus')
+ @DocsEditable()
+ void set autofocus(bool val) => JS("void", "#.autofocus = #", this.raw, unwrap_jso(val));
+
+ @DomName('HTMLInputElement.capture')
+ @DocsEditable()
+ @Experimental() // untriaged
+ bool get capture => wrap_jso(JS("bool", "#.capture", this.raw));
+ @DomName('HTMLInputElement.capture')
+ @DocsEditable()
+ @Experimental() // untriaged
+ void set capture(bool val) => JS("void", "#.capture = #", this.raw, unwrap_jso(val));
+
+ @DomName('HTMLInputElement.checked')
+ @DocsEditable()
+ bool get checked => wrap_jso(JS("bool", "#.checked", this.raw));
+ @DomName('HTMLInputElement.checked')
+ @DocsEditable()
+ void set checked(bool val) => JS("void", "#.checked = #", this.raw, unwrap_jso(val));
+
+ @DomName('HTMLInputElement.defaultChecked')
+ @DocsEditable()
+ bool get defaultChecked => wrap_jso(JS("bool", "#.defaultChecked", this.raw));
+ @DomName('HTMLInputElement.defaultChecked')
+ @DocsEditable()
+ void set defaultChecked(bool val) => JS("void", "#.defaultChecked = #", this.raw, unwrap_jso(val));
+
+ @DomName('HTMLInputElement.defaultValue')
+ @DocsEditable()
+ String get defaultValue => wrap_jso(JS("String", "#.defaultValue", this.raw));
+ @DomName('HTMLInputElement.defaultValue')
+ @DocsEditable()
+ void set defaultValue(String val) => JS("void", "#.defaultValue = #", this.raw, unwrap_jso(val));
+
+ @DomName('HTMLInputElement.dirName')
+ @DocsEditable()
+ String get dirName => wrap_jso(JS("String", "#.dirName", this.raw));
+ @DomName('HTMLInputElement.dirName')
+ @DocsEditable()
+ void set dirName(String val) => JS("void", "#.dirName = #", this.raw, unwrap_jso(val));
+
+ @DomName('HTMLInputElement.disabled')
+ @DocsEditable()
+ bool get disabled => wrap_jso(JS("bool", "#.disabled", this.raw));
+ @DomName('HTMLInputElement.disabled')
+ @DocsEditable()
+ void set disabled(bool val) => JS("void", "#.disabled = #", this.raw, unwrap_jso(val));
+
+ @DomName('HTMLInputElement.form')
+ @DocsEditable()
+ HtmlElement get form => wrap_jso(JS("HtmlElement", "#.form", this.raw));
+
+ @DomName('HTMLInputElement.formAction')
+ @DocsEditable()
+ String get formAction => wrap_jso(JS("String", "#.formAction", this.raw));
+ @DomName('HTMLInputElement.formAction')
+ @DocsEditable()
+ void set formAction(String val) => JS("void", "#.formAction = #", this.raw, unwrap_jso(val));
+
+ @DomName('HTMLInputElement.formEnctype')
+ @DocsEditable()
+ String get formEnctype => wrap_jso(JS("String", "#.formEnctype", this.raw));
+ @DomName('HTMLInputElement.formEnctype')
+ @DocsEditable()
+ void set formEnctype(String val) => JS("void", "#.formEnctype = #", this.raw, unwrap_jso(val));
+
+ @DomName('HTMLInputElement.formMethod')
+ @DocsEditable()
+ String get formMethod => wrap_jso(JS("String", "#.formMethod", this.raw));
+ @DomName('HTMLInputElement.formMethod')
+ @DocsEditable()
+ void set formMethod(String val) => JS("void", "#.formMethod = #", this.raw, unwrap_jso(val));
+
+ @DomName('HTMLInputElement.formNoValidate')
+ @DocsEditable()
+ bool get formNoValidate => wrap_jso(JS("bool", "#.formNoValidate", this.raw));
+ @DomName('HTMLInputElement.formNoValidate')
+ @DocsEditable()
+ void set formNoValidate(bool val) => JS("void", "#.formNoValidate = #", this.raw, unwrap_jso(val));
+
+ @DomName('HTMLInputElement.formTarget')
+ @DocsEditable()
+ String get formTarget => wrap_jso(JS("String", "#.formTarget", this.raw));
+ @DomName('HTMLInputElement.formTarget')
+ @DocsEditable()
+ void set formTarget(String val) => JS("void", "#.formTarget = #", this.raw, unwrap_jso(val));
+
+ @DomName('HTMLInputElement.height')
+ @DocsEditable()
+ int get height => wrap_jso(JS("int", "#.height", this.raw));
+ @DomName('HTMLInputElement.height')
+ @DocsEditable()
+ void set height(int val) => JS("void", "#.height = #", this.raw, unwrap_jso(val));
+
+ @DomName('HTMLInputElement.incremental')
+ @DocsEditable()
+ // http://www.w3.org/TR/html-markup/input.search.html
+ @Experimental()
+ bool get incremental => wrap_jso(JS("bool", "#.incremental", this.raw));
+ @DomName('HTMLInputElement.incremental')
+ @DocsEditable()
+ // http://www.w3.org/TR/html-markup/input.search.html
+ @Experimental()
+ void set incremental(bool val) => JS("void", "#.incremental = #", this.raw, unwrap_jso(val));
+
+ @DomName('HTMLInputElement.indeterminate')
+ @DocsEditable()
+ bool get indeterminate => wrap_jso(JS("bool", "#.indeterminate", this.raw));
+ @DomName('HTMLInputElement.indeterminate')
+ @DocsEditable()
+ void set indeterminate(bool val) => JS("void", "#.indeterminate = #", this.raw, unwrap_jso(val));
+
+ @DomName('HTMLInputElement.inputMode')
+ @DocsEditable()
+ @Experimental() // untriaged
+ String get inputMode => wrap_jso(JS("String", "#.inputMode", this.raw));
+ @DomName('HTMLInputElement.inputMode')
+ @DocsEditable()
+ @Experimental() // untriaged
+ void set inputMode(String val) => JS("void", "#.inputMode = #", this.raw, unwrap_jso(val));
+
+ @DomName('HTMLInputElement.labels')
+ @DocsEditable()
+ @Returns('NodeList')
+ @Creates('NodeList')
+ List<Node> get labels => wrap_jso(JS("List<Node>", "#.labels", this.raw));
+
+ @DomName('HTMLInputElement.list')
+ @DocsEditable()
+ HtmlElement get list => wrap_jso(JS("HtmlElement", "#.list", this.raw));
+
+ @DomName('HTMLInputElement.max')
+ @DocsEditable()
+ String get max => wrap_jso(JS("String", "#.max", this.raw));
+ @DomName('HTMLInputElement.max')
+ @DocsEditable()
+ void set max(String val) => JS("void", "#.max = #", this.raw, unwrap_jso(val));
+
+ @DomName('HTMLInputElement.maxLength')
+ @DocsEditable()
+ int get maxLength => wrap_jso(JS("int", "#.maxLength", this.raw));
+ @DomName('HTMLInputElement.maxLength')
+ @DocsEditable()
+ void set maxLength(int val) => JS("void", "#.maxLength = #", this.raw, unwrap_jso(val));
+
+ @DomName('HTMLInputElement.min')
+ @DocsEditable()
+ String get min => wrap_jso(JS("String", "#.min", this.raw));
+ @DomName('HTMLInputElement.min')
+ @DocsEditable()
+ void set min(String val) => JS("void", "#.min = #", this.raw, unwrap_jso(val));
+
+ @DomName('HTMLInputElement.multiple')
+ @DocsEditable()
+ bool get multiple => wrap_jso(JS("bool", "#.multiple", this.raw));
+ @DomName('HTMLInputElement.multiple')
+ @DocsEditable()
+ void set multiple(bool val) => JS("void", "#.multiple = #", this.raw, unwrap_jso(val));
+
+ @DomName('HTMLInputElement.name')
+ @DocsEditable()
+ String get name => wrap_jso(JS("String", "#.name", this.raw));
+ @DomName('HTMLInputElement.name')
+ @DocsEditable()
+ void set name(String val) => JS("void", "#.name = #", this.raw, unwrap_jso(val));
+
+ @DomName('HTMLInputElement.pattern')
+ @DocsEditable()
+ String get pattern => wrap_jso(JS("String", "#.pattern", this.raw));
+ @DomName('HTMLInputElement.pattern')
+ @DocsEditable()
+ void set pattern(String val) => JS("void", "#.pattern = #", this.raw, unwrap_jso(val));
+
+ @DomName('HTMLInputElement.placeholder')
+ @DocsEditable()
+ String get placeholder => wrap_jso(JS("String", "#.placeholder", this.raw));
+ @DomName('HTMLInputElement.placeholder')
+ @DocsEditable()
+ void set placeholder(String val) => JS("void", "#.placeholder = #", this.raw, unwrap_jso(val));
+
+ @DomName('HTMLInputElement.readOnly')
+ @DocsEditable()
+ bool get readOnly => wrap_jso(JS("bool", "#.readOnly", this.raw));
+ @DomName('HTMLInputElement.readOnly')
+ @DocsEditable()
+ void set readOnly(bool val) => JS("void", "#.readOnly = #", this.raw, unwrap_jso(val));
+
+ @DomName('HTMLInputElement.required')
+ @DocsEditable()
+ bool get required => wrap_jso(JS("bool", "#.required", this.raw));
+ @DomName('HTMLInputElement.required')
+ @DocsEditable()
+ void set required(bool val) => JS("void", "#.required = #", this.raw, unwrap_jso(val));
+
+ @DomName('HTMLInputElement.selectionDirection')
+ @DocsEditable()
+ String get selectionDirection => wrap_jso(JS("String", "#.selectionDirection", this.raw));
+ @DomName('HTMLInputElement.selectionDirection')
+ @DocsEditable()
+ void set selectionDirection(String val) => JS("void", "#.selectionDirection = #", this.raw, unwrap_jso(val));
+
+ @DomName('HTMLInputElement.selectionEnd')
+ @DocsEditable()
+ int get selectionEnd => wrap_jso(JS("int", "#.selectionEnd", this.raw));
+ @DomName('HTMLInputElement.selectionEnd')
+ @DocsEditable()
+ void set selectionEnd(int val) => JS("void", "#.selectionEnd = #", this.raw, unwrap_jso(val));
+
+ @DomName('HTMLInputElement.selectionStart')
+ @DocsEditable()
+ int get selectionStart => wrap_jso(JS("int", "#.selectionStart", this.raw));
+ @DomName('HTMLInputElement.selectionStart')
+ @DocsEditable()
+ void set selectionStart(int val) => JS("void", "#.selectionStart = #", this.raw, unwrap_jso(val));
+
+ @DomName('HTMLInputElement.size')
+ @DocsEditable()
+ int get size => wrap_jso(JS("int", "#.size", this.raw));
+ @DomName('HTMLInputElement.size')
+ @DocsEditable()
+ void set size(int val) => JS("void", "#.size = #", this.raw, unwrap_jso(val));
+
+ @DomName('HTMLInputElement.src')
+ @DocsEditable()
+ String get src => wrap_jso(JS("String", "#.src", this.raw));
+ @DomName('HTMLInputElement.src')
+ @DocsEditable()
+ void set src(String val) => JS("void", "#.src = #", this.raw, unwrap_jso(val));
+
+ @DomName('HTMLInputElement.step')
+ @DocsEditable()
+ String get step => wrap_jso(JS("String", "#.step", this.raw));
+ @DomName('HTMLInputElement.step')
+ @DocsEditable()
+ void set step(String val) => JS("void", "#.step = #", this.raw, unwrap_jso(val));
+
+ @DomName('HTMLInputElement.type')
+ @DocsEditable()
+ String get type => wrap_jso(JS("String", "#.type", this.raw));
+ @DomName('HTMLInputElement.type')
+ @DocsEditable()
+ void set type(String val) => JS("void", "#.type = #", this.raw, unwrap_jso(val));
+
+ @DomName('HTMLInputElement.validationMessage')
+ @DocsEditable()
+ String get validationMessage => wrap_jso(JS("String", "#.validationMessage", this.raw));
+
+ @DomName('HTMLInputElement.value')
+ @DocsEditable()
+ String get value => wrap_jso(JS("String", "#.value", this.raw));
+ @DomName('HTMLInputElement.value')
+ @DocsEditable()
+ void set value(String val) => JS("void", "#.value = #", this.raw, unwrap_jso(val));
+
+ @DomName('HTMLInputElement.valueAsDate')
+ @DocsEditable()
+ DateTime get valueAsDate => convertNativeToDart_DateTime(this._get_valueAsDate);
+ @JSName('valueAsDate')
+ @DomName('HTMLInputElement.valueAsDate')
+ @DocsEditable()
+ @Creates('Null')
+ dynamic get _get_valueAsDate => wrap_jso(JS("dynamic", "#.valueAsDate", this.raw));
+
+ set valueAsDate(DateTime value) {
+ this._set_valueAsDate = convertDartToNative_DateTime(value);
+ }
+ set _set_valueAsDate(/*dynamic*/ value) {
+ JS("void", "#.raw.valueAsDate = #", this, unwrap_jso(value));
+ }
+
+ @DomName('HTMLInputElement.valueAsNumber')
+ @DocsEditable()
+ num get valueAsNumber => wrap_jso(JS("num", "#.valueAsNumber", this.raw));
+ @DomName('HTMLInputElement.valueAsNumber')
+ @DocsEditable()
+ void set valueAsNumber(num val) => JS("void", "#.valueAsNumber = #", this.raw, unwrap_jso(val));
+
+ @JSName('webkitdirectory')
+ @DomName('HTMLInputElement.webkitdirectory')
+ @DocsEditable()
+ @SupportedBrowser(SupportedBrowser.CHROME)
+ @SupportedBrowser(SupportedBrowser.SAFARI)
+ @Experimental()
+ // https://plus.sandbox.google.com/+AddyOsmani/posts/Dk5UhZ6zfF3
+ bool get directory => wrap_jso(JS("bool", "#.webkitdirectory", this.raw));
+ @JSName('webkitdirectory')
+ @DomName('HTMLInputElement.webkitdirectory')
+ @DocsEditable()
+ @SupportedBrowser(SupportedBrowser.CHROME)
+ @SupportedBrowser(SupportedBrowser.SAFARI)
+ @Experimental()
+ // https://plus.sandbox.google.com/+AddyOsmani/posts/Dk5UhZ6zfF3
+ void set directory(bool val) => JS("void", "#.webkitdirectory = #", this.raw, unwrap_jso(val));
+
+ @DomName('HTMLInputElement.width')
+ @DocsEditable()
+ int get width => wrap_jso(JS("int", "#.width", this.raw));
+ @DomName('HTMLInputElement.width')
+ @DocsEditable()
+ void set width(int val) => JS("void", "#.width = #", this.raw, unwrap_jso(val));
+
+ @DomName('HTMLInputElement.willValidate')
+ @DocsEditable()
+ bool get willValidate => wrap_jso(JS("bool", "#.willValidate", this.raw));
+
+ @DomName('HTMLInputElement.checkValidity')
+ @DocsEditable()
+ bool checkValidity() {
+ return _checkValidity_1();
+ }
+ @JSName('checkValidity')
+ @DomName('HTMLInputElement.checkValidity')
+ @DocsEditable()
+ bool _checkValidity_1() => wrap_jso(JS("bool ", "#.raw.checkValidity()", this));
+
+ @DomName('HTMLInputElement.select')
+ @DocsEditable()
+ void select() {
+ _select_1();
+ return;
+ }
+ @JSName('select')
+ @DomName('HTMLInputElement.select')
+ @DocsEditable()
+ void _select_1() => wrap_jso(JS("void ", "#.raw.select()", this));
+
+ @DomName('HTMLInputElement.setCustomValidity')
+ @DocsEditable()
+ void setCustomValidity(String error) {
+ _setCustomValidity_1(error);
+ return;
+ }
+ @JSName('setCustomValidity')
+ @DomName('HTMLInputElement.setCustomValidity')
+ @DocsEditable()
+ void _setCustomValidity_1(error) => wrap_jso(JS("void ", "#.raw.setCustomValidity(#)", this, unwrap_jso(error)));
+
+ @DomName('HTMLInputElement.setRangeText')
+ @DocsEditable()
+ // http://www.whatwg.org/specs/web-apps/current-work/multipage/association-of-controls-and-forms.html#dom-textarea/input-setrangetext
+ @Experimental() // experimental
+ void setRangeText(String replacement, {int start, int end, String selectionMode}) {
+ if (start == null && end == null && selectionMode == null) {
+ _setRangeText_1(replacement);
+ return;
+ }
+ if (end != null && start != null && selectionMode == null) {
+ _setRangeText_2(replacement, start, end);
+ return;
+ }
+ if (selectionMode != null && end != null && start != null) {
+ _setRangeText_3(replacement, start, end, selectionMode);
+ return;
+ }
+ throw new ArgumentError("Incorrect number or type of arguments");
+ }
+ @JSName('setRangeText')
+ @DomName('HTMLInputElement.setRangeText')
+ @DocsEditable()
+ // http://www.whatwg.org/specs/web-apps/current-work/multipage/association-of-controls-and-forms.html#dom-textarea/input-setrangetext
+ @Experimental() // experimental
+ void _setRangeText_1(replacement) => wrap_jso(JS("void ", "#.raw.setRangeText(#)", this, unwrap_jso(replacement)));
+ @JSName('setRangeText')
+ @DomName('HTMLInputElement.setRangeText')
+ @DocsEditable()
+ // http://www.whatwg.org/specs/web-apps/current-work/multipage/association-of-controls-and-forms.html#dom-textarea/input-setrangetext
+ @Experimental() // experimental
+ void _setRangeText_2(replacement, start, end) => wrap_jso(JS("void ", "#.raw.setRangeText(#, #, #)", this, unwrap_jso(replacement), unwrap_jso(start), unwrap_jso(end)));
+ @JSName('setRangeText')
+ @DomName('HTMLInputElement.setRangeText')
+ @DocsEditable()
+ // http://www.whatwg.org/specs/web-apps/current-work/multipage/association-of-controls-and-forms.html#dom-textarea/input-setrangetext
+ @Experimental() // experimental
+ void _setRangeText_3(replacement, start, end, selectionMode) => wrap_jso(JS("void ", "#.raw.setRangeText(#, #, #, #)", this, unwrap_jso(replacement), unwrap_jso(start), unwrap_jso(end), unwrap_jso(selectionMode)));
+
+ @DomName('HTMLInputElement.setSelectionRange')
+ @DocsEditable()
+ void setSelectionRange(int start, int end, [String direction]) {
+ if (direction != null) {
+ _setSelectionRange_1(start, end, direction);
+ return;
+ }
+ _setSelectionRange_2(start, end);
+ return;
+ }
+ @JSName('setSelectionRange')
+ @DomName('HTMLInputElement.setSelectionRange')
+ @DocsEditable()
+ void _setSelectionRange_1(start, end, direction) => wrap_jso(JS("void ", "#.raw.setSelectionRange(#, #, #)", this, unwrap_jso(start), unwrap_jso(end), unwrap_jso(direction)));
+ @JSName('setSelectionRange')
+ @DomName('HTMLInputElement.setSelectionRange')
+ @DocsEditable()
+ void _setSelectionRange_2(start, end) => wrap_jso(JS("void ", "#.raw.setSelectionRange(#, #)", this, unwrap_jso(start), unwrap_jso(end)));
+
+ @DomName('HTMLInputElement.stepDown')
+ @DocsEditable()
+ void stepDown([int n]) {
+ if (n != null) {
+ _stepDown_1(n);
+ return;
+ }
+ _stepDown_2();
+ return;
+ }
+ @JSName('stepDown')
+ @DomName('HTMLInputElement.stepDown')
+ @DocsEditable()
+ void _stepDown_1(n) => wrap_jso(JS("void ", "#.raw.stepDown(#)", this, unwrap_jso(n)));
+ @JSName('stepDown')
+ @DomName('HTMLInputElement.stepDown')
+ @DocsEditable()
+ void _stepDown_2() => wrap_jso(JS("void ", "#.raw.stepDown()", this));
+
+ @DomName('HTMLInputElement.stepUp')
+ @DocsEditable()
+ void stepUp([int n]) {
+ if (n != null) {
+ _stepUp_1(n);
+ return;
+ }
+ _stepUp_2();
+ return;
+ }
+ @JSName('stepUp')
+ @DomName('HTMLInputElement.stepUp')
+ @DocsEditable()
+ void _stepUp_1(n) => wrap_jso(JS("void ", "#.raw.stepUp(#)", this, unwrap_jso(n)));
+ @JSName('stepUp')
+ @DomName('HTMLInputElement.stepUp')
+ @DocsEditable()
+ void _stepUp_2() => wrap_jso(JS("void ", "#.raw.stepUp()", this));
+
+}
+
+
+// Interfaces representing the InputElement APIs which are supported
+// for the various types of InputElement. From:
+// http://www.w3.org/html/wg/drafts/html/master/forms.html#the-input-element.
+
+/**
+ * Exposes the functionality common between all InputElement types.
+ */
+abstract class InputElementBase implements Element {
+ @DomName('HTMLInputElement.autofocus')
+ bool autofocus;
+
+ @DomName('HTMLInputElement.disabled')
+ bool disabled;
+
+ @DomName('HTMLInputElement.incremental')
+ bool incremental;
+
+ @DomName('HTMLInputElement.indeterminate')
+ bool indeterminate;
+
+ @DomName('HTMLInputElement.labels')
+ List<Node> get labels;
+
+ @DomName('HTMLInputElement.name')
+ String name;
+
+ @DomName('HTMLInputElement.validationMessage')
+ String get validationMessage;
+
+
+ @DomName('HTMLInputElement.value')
+ String value;
+
+ @DomName('HTMLInputElement.willValidate')
+ bool get willValidate;
+
+ @DomName('HTMLInputElement.checkValidity')
+ bool checkValidity();
+
+ @DomName('HTMLInputElement.setCustomValidity')
+ void setCustomValidity(String error);
+}
+
+/**
+ * Hidden input which is not intended to be seen or edited by the user.
+ */
+abstract class HiddenInputElement implements InputElementBase {
+ factory HiddenInputElement() => new InputElement(type: 'hidden');
+}
+
+
+/**
+ * Base interface for all inputs which involve text editing.
+ */
+abstract class TextInputElementBase implements InputElementBase {
+ @DomName('HTMLInputElement.autocomplete')
+ String autocomplete;
+
+ @DomName('HTMLInputElement.maxLength')
+ int maxLength;
+
+ @DomName('HTMLInputElement.pattern')
+ String pattern;
+
+ @DomName('HTMLInputElement.placeholder')
+ String placeholder;
+
+ @DomName('HTMLInputElement.readOnly')
+ bool readOnly;
+
+ @DomName('HTMLInputElement.required')
+ bool required;
+
+ @DomName('HTMLInputElement.size')
+ int size;
+
+ @DomName('HTMLInputElement.select')
+ void select();
+
+ @DomName('HTMLInputElement.selectionDirection')
+ String selectionDirection;
+
+ @DomName('HTMLInputElement.selectionEnd')
+ int selectionEnd;
+
+ @DomName('HTMLInputElement.selectionStart')
+ int selectionStart;
+
+ @DomName('HTMLInputElement.setSelectionRange')
+ void setSelectionRange(int start, int end, [String direction]);
+}
+
+/**
+ * Similar to [TextInputElement], but on platforms where search is styled
+ * differently this will get the search style.
+ *
+ * Use [supported] to check if this is supported on the current platform.
+ */
+@SupportedBrowser(SupportedBrowser.CHROME)
+@SupportedBrowser(SupportedBrowser.FIREFOX)
+@SupportedBrowser(SupportedBrowser.IE, '10')
+@SupportedBrowser(SupportedBrowser.SAFARI)
+abstract class SearchInputElement implements TextInputElementBase {
+ factory SearchInputElement() => new InputElement(type: 'search');
+
+ @DomName('HTMLInputElement.dirName')
+ String dirName;
+
+ @DomName('HTMLInputElement.list')
+ Element get list;
+
+ /// Returns true if this input type is supported on the current platform.
+ static bool get supported {
+ return (new InputElement(type: 'search')).type == 'search';
+ }
+}
+
+/**
+ * A basic text input editor control.
+ */
+abstract class TextInputElement implements TextInputElementBase {
+ factory TextInputElement() => new InputElement(type: 'text');
+
+ @DomName('HTMLInputElement.dirName')
+ String dirName;
+
+ @DomName('HTMLInputElement.list')
+ Element get list;
+}
+
+/**
+ * A control for editing an absolute URL.
+ *
+ * Use [supported] to check if this is supported on the current platform.
+ */
+@SupportedBrowser(SupportedBrowser.CHROME)
+@SupportedBrowser(SupportedBrowser.FIREFOX)
+@SupportedBrowser(SupportedBrowser.IE, '10')
+@SupportedBrowser(SupportedBrowser.SAFARI)
+abstract class UrlInputElement implements TextInputElementBase {
+ factory UrlInputElement() => new InputElement(type: 'url');
+
+ @DomName('HTMLInputElement.list')
+ Element get list;
+
+ /// Returns true if this input type is supported on the current platform.
+ static bool get supported {
+ return (new InputElement(type: 'url')).type == 'url';
+ }
+}
+
+/**
+ * Represents a control for editing a telephone number.
+ *
+ * This provides a single line of text with minimal formatting help since
+ * there is a wide variety of telephone numbers.
+ *
+ * Use [supported] to check if this is supported on the current platform.
+ */
+@SupportedBrowser(SupportedBrowser.CHROME)
+@SupportedBrowser(SupportedBrowser.FIREFOX)
+@SupportedBrowser(SupportedBrowser.IE, '10')
+@SupportedBrowser(SupportedBrowser.SAFARI)
+abstract class TelephoneInputElement implements TextInputElementBase {
+ factory TelephoneInputElement() => new InputElement(type: 'tel');
+
+ @DomName('HTMLInputElement.list')
+ Element get list;
+
+ /// Returns true if this input type is supported on the current platform.
+ static bool get supported {
+ return (new InputElement(type: 'tel')).type == 'tel';
+ }
+}
+
+/**
+ * An e-mail address or list of e-mail addresses.
+ *
+ * Use [supported] to check if this is supported on the current platform.
+ */
+@SupportedBrowser(SupportedBrowser.CHROME)
+@SupportedBrowser(SupportedBrowser.FIREFOX)
+@SupportedBrowser(SupportedBrowser.IE, '10')
+@SupportedBrowser(SupportedBrowser.SAFARI)
+abstract class EmailInputElement implements TextInputElementBase {
+ factory EmailInputElement() => new InputElement(type: 'email');
+
+ @DomName('HTMLInputElement.autocomplete')
+ String autocomplete;
+
+ @DomName('HTMLInputElement.autofocus')
+ bool autofocus;
+
+ @DomName('HTMLInputElement.list')
+ Element get list;
+
+ @DomName('HTMLInputElement.maxLength')
+ int maxLength;
+
+ @DomName('HTMLInputElement.multiple')
+ bool multiple;
+
+ @DomName('HTMLInputElement.pattern')
+ String pattern;
+
+ @DomName('HTMLInputElement.placeholder')
+ String placeholder;
+
+ @DomName('HTMLInputElement.readOnly')
+ bool readOnly;
+
+ @DomName('HTMLInputElement.required')
+ bool required;
+
+ @DomName('HTMLInputElement.size')
+ int size;
+
+ /// Returns true if this input type is supported on the current platform.
+ static bool get supported {
+ return (new InputElement(type: 'email')).type == 'email';
+ }
+}
+
+/**
+ * Text with no line breaks (sensitive information).
+ */
+abstract class PasswordInputElement implements TextInputElementBase {
+ factory PasswordInputElement() => new InputElement(type: 'password');
+}
+
+/**
+ * Base interface for all input element types which involve ranges.
+ */
+abstract class RangeInputElementBase implements InputElementBase {
+
+ @DomName('HTMLInputElement.list')
+ Element get list;
+
+ @DomName('HTMLInputElement.max')
+ String max;
+
+ @DomName('HTMLInputElement.min')
+ String min;
+
+ @DomName('HTMLInputElement.step')
+ String step;
+
+ @DomName('HTMLInputElement.valueAsNumber')
+ num valueAsNumber;
+
+ @DomName('HTMLInputElement.stepDown')
+ void stepDown([int n]);
+
+ @DomName('HTMLInputElement.stepUp')
+ void stepUp([int n]);
+}
+
+/**
+ * A date (year, month, day) with no time zone.
+ *
+ * Use [supported] to check if this is supported on the current platform.
+ */
+@SupportedBrowser(SupportedBrowser.CHROME, '25')
+@Experimental()
+abstract class DateInputElement implements RangeInputElementBase {
+ factory DateInputElement() => new InputElement(type: 'date');
+
+ @DomName('HTMLInputElement.valueAsDate')
+ DateTime valueAsDate;
+
+ @DomName('HTMLInputElement.readOnly')
+ bool readOnly;
+
+ @DomName('HTMLInputElement.required')
+ bool required;
+
+ /// Returns true if this input type is supported on the current platform.
+ static bool get supported {
+ return (new InputElement(type: 'date')).type == 'date';
+ }
+}
+
+/**
+ * A date consisting of a year and a month with no time zone.
+ *
+ * Use [supported] to check if this is supported on the current platform.
+ */
+@SupportedBrowser(SupportedBrowser.CHROME, '25')
+@Experimental()
+abstract class MonthInputElement implements RangeInputElementBase {
+ factory MonthInputElement() => new InputElement(type: 'month');
+
+ @DomName('HTMLInputElement.valueAsDate')
+ DateTime valueAsDate;
+
+ @DomName('HTMLInputElement.readOnly')
+ bool readOnly;
+
+ @DomName('HTMLInputElement.required')
+ bool required;
+
+ /// Returns true if this input type is supported on the current platform.
+ static bool get supported {
+ return (new InputElement(type: 'month')).type == 'month';
+ }
+}
+
+/**
+ * A date consisting of a week-year number and a week number with no time zone.
+ *
+ * Use [supported] to check if this is supported on the current platform.
+ */
+@SupportedBrowser(SupportedBrowser.CHROME, '25')
+@Experimental()
+abstract class WeekInputElement implements RangeInputElementBase {
+ factory WeekInputElement() => new InputElement(type: 'week');
+
+ @DomName('HTMLInputElement.valueAsDate')
+ DateTime valueAsDate;
+
+ @DomName('HTMLInputElement.readOnly')
+ bool readOnly;
+
+ @DomName('HTMLInputElement.required')
+ bool required;
+
+ /// Returns true if this input type is supported on the current platform.
+ static bool get supported {
+ return (new InputElement(type: 'week')).type == 'week';
+ }
+}
+
+/**
+ * A time (hour, minute, seconds, fractional seconds) with no time zone.
+ *
+ * Use [supported] to check if this is supported on the current platform.
+ */
+@SupportedBrowser(SupportedBrowser.CHROME)
+@Experimental()
+abstract class TimeInputElement implements RangeInputElementBase {
+ factory TimeInputElement() => new InputElement(type: 'time');
+
+ @DomName('HTMLInputElement.valueAsDate')
+ DateTime valueAsDate;
+
+ @DomName('HTMLInputElement.readOnly')
+ bool readOnly;
+
+ @DomName('HTMLInputElement.required')
+ bool required;
+
+ /// Returns true if this input type is supported on the current platform.
+ static bool get supported {
+ return (new InputElement(type: 'time')).type == 'time';
+ }
+}
+
+/**
+ * A date and time (year, month, day, hour, minute, second, fraction of a
+ * second) with no time zone.
+ *
+ * Use [supported] to check if this is supported on the current platform.
+ */
+@SupportedBrowser(SupportedBrowser.CHROME, '25')
+@Experimental()
+abstract class LocalDateTimeInputElement implements RangeInputElementBase {
+ factory LocalDateTimeInputElement() =>
+ new InputElement(type: 'datetime-local');
+
+ @DomName('HTMLInputElement.readOnly')
+ bool readOnly;
+
+ @DomName('HTMLInputElement.required')
+ bool required;
+
+ /// Returns true if this input type is supported on the current platform.
+ static bool get supported {
+ return (new InputElement(type: 'datetime-local')).type == 'datetime-local';
+ }
+}
+
+/**
+ * A numeric editor control.
+ */
+@SupportedBrowser(SupportedBrowser.CHROME)
+@SupportedBrowser(SupportedBrowser.IE)
+@SupportedBrowser(SupportedBrowser.SAFARI)
+@Experimental()
+abstract class NumberInputElement implements RangeInputElementBase {
+ factory NumberInputElement() => new InputElement(type: 'number');
+
+ @DomName('HTMLInputElement.placeholder')
+ String placeholder;
+
+ @DomName('HTMLInputElement.readOnly')
+ bool readOnly;
+
+ @DomName('HTMLInputElement.required')
+ bool required;
+
+ /// Returns true if this input type is supported on the current platform.
+ static bool get supported {
+ return (new InputElement(type: 'number')).type == 'number';
+ }
+}
+
+/**
+ * Similar to [NumberInputElement] but the browser may provide more optimal
+ * styling (such as a slider control).
+ *
+ * Use [supported] to check if this is supported on the current platform.
+ */
+@SupportedBrowser(SupportedBrowser.CHROME)
+@SupportedBrowser(SupportedBrowser.IE, '10')
+@Experimental()
+abstract class RangeInputElement implements RangeInputElementBase {
+ factory RangeInputElement() => new InputElement(type: 'range');
+
+ /// Returns true if this input type is supported on the current platform.
+ static bool get supported {
+ return (new InputElement(type: 'range')).type == 'range';
+ }
+}
+
+/**
+ * A boolean editor control.
+ *
+ * Note that if [indeterminate] is set then this control is in a third
+ * indeterminate state.
+ */
+abstract class CheckboxInputElement implements InputElementBase {
+ factory CheckboxInputElement() => new InputElement(type: 'checkbox');
+
+ @DomName('HTMLInputElement.checked')
+ bool checked;
+
+ @DomName('HTMLInputElement.required')
+ bool required;
+}
+
+
+/**
+ * A control that when used with other [ReadioButtonInputElement] controls
+ * forms a radio button group in which only one control can be checked at a
+ * time.
+ *
+ * Radio buttons are considered to be in the same radio button group if:
+ *
+ * * They are all of type 'radio'.
+ * * They all have either the same [FormElement] owner, or no owner.
+ * * Their name attributes contain the same name.
+ */
+abstract class RadioButtonInputElement implements InputElementBase {
+ factory RadioButtonInputElement() => new InputElement(type: 'radio');
+
+ @DomName('HTMLInputElement.checked')
+ bool checked;
+
+ @DomName('HTMLInputElement.required')
+ bool required;
+}
+
+/**
+ * A control for picking files from the user's computer.
+ */
+abstract class FileUploadInputElement implements InputElementBase {
+ factory FileUploadInputElement() => new InputElement(type: 'file');
+
+ @DomName('HTMLInputElement.accept')
+ String accept;
+
+ @DomName('HTMLInputElement.multiple')
+ bool multiple;
+
+ @DomName('HTMLInputElement.required')
+ bool required;
+
+}
+
+/**
+ * A button, which when clicked, submits the form.
+ */
+abstract class SubmitButtonInputElement implements InputElementBase {
+ factory SubmitButtonInputElement() => new InputElement(type: 'submit');
+
+ @DomName('HTMLInputElement.formAction')
+ String formAction;
+
+ @DomName('HTMLInputElement.formEnctype')
+ String formEnctype;
+
+ @DomName('HTMLInputElement.formMethod')
+ String formMethod;
+
+ @DomName('HTMLInputElement.formNoValidate')
+ bool formNoValidate;
+
+ @DomName('HTMLInputElement.formTarget')
+ String formTarget;
+}
+
+/**
+ * Either an image which the user can select a coordinate to or a form
+ * submit button.
+ */
+abstract class ImageButtonInputElement implements InputElementBase {
+ factory ImageButtonInputElement() => new InputElement(type: 'image');
+
+ @DomName('HTMLInputElement.alt')
+ String alt;
+
+ @DomName('HTMLInputElement.formAction')
+ String formAction;
+
+ @DomName('HTMLInputElement.formEnctype')
+ String formEnctype;
+
+ @DomName('HTMLInputElement.formMethod')
+ String formMethod;
+
+ @DomName('HTMLInputElement.formNoValidate')
+ bool formNoValidate;
+
+ @DomName('HTMLInputElement.formTarget')
+ String formTarget;
+
+ @DomName('HTMLInputElement.height')
+ int height;
+
+ @DomName('HTMLInputElement.src')
+ String src;
+
+ @DomName('HTMLInputElement.width')
+ int width;
+}
+
+/**
+ * A button, which when clicked, resets the form.
+ */
+abstract class ResetButtonInputElement implements InputElementBase {
+ factory ResetButtonInputElement() => new InputElement(type: 'reset');
+}
+
+/**
+ * A button, with no default behavior.
+ */
+abstract class ButtonInputElement implements InputElementBase {
+ factory ButtonInputElement() => new InputElement(type: 'button');
+}
+// 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.
+
+
+/**
+ * An event that describes user interaction with the keyboard.
+ *
+ * The [type] of the event identifies what kind of interaction occurred.
+ *
+ * See also:
+ *
+ * * [KeyboardEvent](https://developer.mozilla.org/en/DOM/KeyboardEvent) at MDN.
+ */
+@DomName('KeyboardEvent')
+@Native("KeyboardEvent")
+class KeyboardEvent extends UIEvent {
+
+ /**
+ * Programmatically create a KeyboardEvent.
+ *
+ * Due to browser differences, keyCode, charCode, or keyIdentifier values
+ * cannot be specified in this base level constructor. This constructor
+ * enables the user to programmatically create and dispatch a [KeyboardEvent],
+ * but it will not contain any particular key content. For programmatically
+ * creating keyboard events with specific key value contents, see the custom
+ * Event [KeyEvent].
+ */
+ factory KeyboardEvent(String type,
+ {Window view, bool canBubble: true, bool cancelable: true,
+ int keyLocation: 1, bool ctrlKey: false,
+ bool altKey: false, bool shiftKey: false, bool metaKey: false}) {
+ if (view == null) {
+ view = window;
+ }
+ KeyboardEvent e = document._createEvent("KeyboardEvent");
+ e._initKeyboardEvent(type, canBubble, cancelable, view, "",
+ keyLocation, ctrlKey, altKey, shiftKey, metaKey);
+ return e;
+ }
+
+ @DomName('KeyboardEvent.initKeyboardEvent')
+ void _initKeyboardEvent(String type, bool canBubble, bool cancelable,
+ Window view, String keyIdentifier, int keyLocation, bool ctrlKey,
+ bool altKey, bool shiftKey, bool metaKey) {
+ if (JS('bool', 'typeof(#.initKeyEvent) == "function"', this.raw)) {
+ // initKeyEvent is only in Firefox (instead of initKeyboardEvent). It has
+ // a slightly different signature, and allows you to specify keyCode and
+ // charCode as the last two arguments, but we just set them as the default
+ // since they can't be specified in other browsers.
+ JS('void', '#.initKeyEvent(#, #, #, #, #, #, #, #, 0, 0)', this.raw,
+ type, canBubble, cancelable, unwrap_jso(view),
+ ctrlKey, altKey, shiftKey, metaKey);
+ } else {
+ // initKeyboardEvent is for all other browsers.
+ JS('void', '#.initKeyboardEvent(#, #, #, #, #, #, #, #, #, #)', this.raw,
+ type, canBubble, cancelable, unwrap_jso(view), keyIdentifier, keyLocation,
+ ctrlKey, altKey, shiftKey, metaKey);
+ }
+ }
+
+ @DomName('KeyboardEvent.keyCode')
+ int get keyCode => _keyCode;
+
+ @DomName('KeyboardEvent.charCode')
+ int get charCode => _charCode;
+ // To suppress missing implicit constructor warnings.
+ factory KeyboardEvent._() { throw new UnsupportedError("Not supported"); }
+
+
+ @Deprecated("Internal Use Only")
+ static KeyboardEvent internalCreateKeyboardEvent() {
+ return new KeyboardEvent.internal_();
+ }
+
+ @Deprecated("Internal Use Only")
+ KeyboardEvent.internal_() : super.internal_();
+
+
+ @DomName('KeyboardEvent.DOM_KEY_LOCATION_LEFT')
+ @DocsEditable()
+ @Experimental() // untriaged
+ static const int DOM_KEY_LOCATION_LEFT = 0x01;
+
+ @DomName('KeyboardEvent.DOM_KEY_LOCATION_NUMPAD')
+ @DocsEditable()
+ @Experimental() // untriaged
+ static const int DOM_KEY_LOCATION_NUMPAD = 0x03;
+
+ @DomName('KeyboardEvent.DOM_KEY_LOCATION_RIGHT')
+ @DocsEditable()
+ @Experimental() // untriaged
+ static const int DOM_KEY_LOCATION_RIGHT = 0x02;
+
+ @DomName('KeyboardEvent.DOM_KEY_LOCATION_STANDARD')
+ @DocsEditable()
+ @Experimental() // untriaged
+ static const int DOM_KEY_LOCATION_STANDARD = 0x00;
+
+ @DomName('KeyboardEvent.altKey')
+ @DocsEditable()
+ bool get altKey => wrap_jso(JS("bool", "#.altKey", this.raw));
+
+ @DomName('KeyboardEvent.ctrlKey')
+ @DocsEditable()
+ bool get ctrlKey => wrap_jso(JS("bool", "#.ctrlKey", this.raw));
+
+ @JSName('keyIdentifier')
+ @DomName('KeyboardEvent.keyIdentifier')
+ @DocsEditable()
+ @Experimental() // nonstandard
+ String get _keyIdentifier => wrap_jso(JS("String", "#.keyIdentifier", this.raw));
+
+ @DomName('KeyboardEvent.keyLocation')
+ @DocsEditable()
+ @Experimental() // nonstandard
+ int get keyLocation => wrap_jso(JS("int", "#.keyLocation", this.raw));
+
+ @DomName('KeyboardEvent.location')
+ @DocsEditable()
+ @Experimental() // untriaged
+ int get location => wrap_jso(JS("int", "#.location", this.raw));
+
+ @DomName('KeyboardEvent.metaKey')
+ @DocsEditable()
+ bool get metaKey => wrap_jso(JS("bool", "#.metaKey", this.raw));
+
+ @DomName('KeyboardEvent.repeat')
+ @DocsEditable()
+ @Experimental() // untriaged
+ bool get repeat => wrap_jso(JS("bool", "#.repeat", this.raw));
+
+ @DomName('KeyboardEvent.shiftKey')
+ @DocsEditable()
+ bool get shiftKey => wrap_jso(JS("bool", "#.shiftKey", this.raw));
+
+ @DomName('KeyboardEvent.getModifierState')
+ @DocsEditable()
+ @Experimental() // untriaged
+ bool getModifierState(String keyArgument) {
+ return _getModifierState_1(keyArgument);
+ }
+ @JSName('getModifierState')
+ @DomName('KeyboardEvent.getModifierState')
+ @DocsEditable()
+ @Experimental() // untriaged
+ bool _getModifierState_1(keyArgument) => wrap_jso(JS("bool ", "#.raw.getModifierState(#)", this, unwrap_jso(keyArgument)));
+
+}
+// Copyright (c) 2013, 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.
+
+
+@DocsEditable()
+@DomName('Location')
+@Native("Location")
+class Location extends DartHtmlDomObject implements LocationBase {
+ // To suppress missing implicit constructor warnings.
+ factory Location._() { throw new UnsupportedError("Not supported"); }
+
+ @Deprecated("Internal Use Only")
+ static Location internalCreateLocation() {
+ return new Location.internal_();
+ }
+
+ @Deprecated("Internal Use Only")
+ Location.internal_() { }
+
+ bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+ int get hashCode => unwrap_jso(this).hashCode;
+
+ @DomName('Location.hash')
+ @DocsEditable()
+ String get hash => wrap_jso(JS("String", "#.hash", this.raw));
+ @DomName('Location.hash')
+ @DocsEditable()
+ void set hash(String val) => JS("void", "#.hash = #", this.raw, unwrap_jso(val));
+
+ @DomName('Location.host')
+ @DocsEditable()
+ String get host => wrap_jso(JS("String", "#.host", this.raw));
+ @DomName('Location.host')
+ @DocsEditable()
+ void set host(String val) => JS("void", "#.host = #", this.raw, unwrap_jso(val));
+
+ @DomName('Location.hostname')
+ @DocsEditable()
+ String get hostname => wrap_jso(JS("String", "#.hostname", this.raw));
+ @DomName('Location.hostname')
+ @DocsEditable()
+ void set hostname(String val) => JS("void", "#.hostname = #", this.raw, unwrap_jso(val));
+
+ @DomName('Location.href')
+ @DocsEditable()
+ String get href => wrap_jso(JS("String", "#.href", this.raw));
+ @DomName('Location.href')
+ @DocsEditable()
+ void set href(String val) => JS("void", "#.href = #", this.raw, unwrap_jso(val));
+
+ @DomName('Location.pathname')
+ @DocsEditable()
+ String get pathname => wrap_jso(JS("String", "#.pathname", this.raw));
+ @DomName('Location.pathname')
+ @DocsEditable()
+ void set pathname(String val) => JS("void", "#.pathname = #", this.raw, unwrap_jso(val));
+
+ @DomName('Location.port')
+ @DocsEditable()
+ String get port => wrap_jso(JS("String", "#.port", this.raw));
+ @DomName('Location.port')
+ @DocsEditable()
+ void set port(String val) => JS("void", "#.port = #", this.raw, unwrap_jso(val));
+
+ @DomName('Location.protocol')
+ @DocsEditable()
+ String get protocol => wrap_jso(JS("String", "#.protocol", this.raw));
+ @DomName('Location.protocol')
+ @DocsEditable()
+ void set protocol(String val) => JS("void", "#.protocol = #", this.raw, unwrap_jso(val));
+
+ @DomName('Location.search')
+ @DocsEditable()
+ String get search => wrap_jso(JS("String", "#.search", this.raw));
+ @DomName('Location.search')
+ @DocsEditable()
+ void set search(String val) => JS("void", "#.search = #", this.raw, unwrap_jso(val));
+
+ @DomName('Location.assign')
+ @DocsEditable()
+ void assign([String url]) {
+ if (url != null) {
+ _assign_1(url);
+ return;
+ }
+ _assign_2();
+ return;
+ }
+ @JSName('assign')
+ @DomName('Location.assign')
+ @DocsEditable()
+ void _assign_1(url) => wrap_jso(JS("void ", "#.raw.assign(#)", this, unwrap_jso(url)));
+ @JSName('assign')
+ @DomName('Location.assign')
+ @DocsEditable()
+ void _assign_2() => wrap_jso(JS("void ", "#.raw.assign()", this));
+
+ @DomName('Location.reload')
+ @DocsEditable()
+ void reload() {
+ _reload_1();
+ return;
+ }
+ @JSName('reload')
+ @DomName('Location.reload')
+ @DocsEditable()
+ void _reload_1() => wrap_jso(JS("void ", "#.raw.reload()", this));
+
+ @DomName('Location.replace')
+ @DocsEditable()
+ void replace(String url) {
+ _replace_1(url);
+ return;
+ }
+ @JSName('replace')
+ @DomName('Location.replace')
+ @DocsEditable()
+ void _replace_1(url) => wrap_jso(JS("void ", "#.raw.replace(#)", this, unwrap_jso(url)));
+
+
+
+}
+// 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.
+
+
+@DocsEditable()
+@DomName('MouseEvent')
+@Native("MouseEvent,DragEvent,PointerEvent,MSPointerEvent")
+class MouseEvent extends UIEvent {
+ // To suppress missing implicit constructor warnings.
+ factory MouseEvent._() { throw new UnsupportedError("Not supported"); }
+
+
+ @Deprecated("Internal Use Only")
+ static MouseEvent internalCreateMouseEvent() {
+ return new MouseEvent.internal_();
+ }
+
+ @Deprecated("Internal Use Only")
+ MouseEvent.internal_() : super.internal_();
+
+
+ @DomName('MouseEvent.altKey')
+ @DocsEditable()
+ bool get altKey => wrap_jso(JS("bool", "#.altKey", this.raw));
+
+ @DomName('MouseEvent.button')
+ @DocsEditable()
+ int get button => wrap_jso(JS("int", "#.button", this.raw));
+
+ @JSName('clientX')
+ @DomName('MouseEvent.clientX')
+ @DocsEditable()
+ int get _clientX => wrap_jso(JS("int", "#.clientX", this.raw));
+
+ @JSName('clientY')
+ @DomName('MouseEvent.clientY')
+ @DocsEditable()
+ int get _clientY => wrap_jso(JS("int", "#.clientY", this.raw));
+
+ @DomName('MouseEvent.ctrlKey')
+ @DocsEditable()
+ bool get ctrlKey => wrap_jso(JS("bool", "#.ctrlKey", this.raw));
+
+ /**
+ * The nonstandard way to access the element that the mouse comes
+ * from in the case of a `mouseover` event.
+ *
+ * This member is deprecated and not cross-browser compatible; use
+ * relatedTarget to get the same information in the standard way.
+ */
+ @DomName('MouseEvent.fromElement')
+ @DocsEditable()
+ @deprecated
+ Node get fromElement => wrap_jso(JS("Node", "#.fromElement", this.raw));
+
+ @DomName('MouseEvent.metaKey')
+ @DocsEditable()
+ bool get metaKey => wrap_jso(JS("bool", "#.metaKey", this.raw));
+
+ @JSName('movementX')
+ @DomName('MouseEvent.movementX')
+ @DocsEditable()
+ @Experimental() // untriaged
+ int get _movementX => wrap_jso(JS("int", "#.movementX", this.raw));
+
+ @JSName('movementY')
+ @DomName('MouseEvent.movementY')
+ @DocsEditable()
+ @Experimental() // untriaged
+ int get _movementY => wrap_jso(JS("int", "#.movementY", this.raw));
+
+ @DomName('MouseEvent.region')
+ @DocsEditable()
+ @Experimental() // untriaged
+ String get region => wrap_jso(JS("String", "#.region", this.raw));
+
+ @DomName('MouseEvent.relatedTarget')
+ @DocsEditable()
+ EventTarget get relatedTarget => _convertNativeToDart_EventTarget(this._get_relatedTarget);
+ @JSName('relatedTarget')
+ @DomName('MouseEvent.relatedTarget')
+ @DocsEditable()
+ @Creates('Node')
+ @Returns('EventTarget|=Object')
+ dynamic get _get_relatedTarget => wrap_jso(JS("dynamic", "#.relatedTarget", this.raw));
+
+ @JSName('screenX')
+ @DomName('MouseEvent.screenX')
+ @DocsEditable()
+ int get _screenX => wrap_jso(JS("int", "#.screenX", this.raw));
+
+ @JSName('screenY')
+ @DomName('MouseEvent.screenY')
+ @DocsEditable()
+ int get _screenY => wrap_jso(JS("int", "#.screenY", this.raw));
+
+ @DomName('MouseEvent.shiftKey')
+ @DocsEditable()
+ bool get shiftKey => wrap_jso(JS("bool", "#.shiftKey", this.raw));
+
+ /**
+ * The nonstandard way to access the element that the mouse goes
+ * to in the case of a `mouseout` event.
+ *
+ * This member is deprecated and not cross-browser compatible; use
+ * relatedTarget to get the same information in the standard way.
+ */
+ @DomName('MouseEvent.toElement')
+ @DocsEditable()
+ @deprecated
+ Node get toElement => wrap_jso(JS("Node", "#.toElement", this.raw));
+
+ @JSName('webkitMovementX')
+ @DomName('MouseEvent.webkitMovementX')
+ @DocsEditable()
+ @SupportedBrowser(SupportedBrowser.CHROME)
+ @SupportedBrowser(SupportedBrowser.SAFARI)
+ @Experimental()
+ int get _webkitMovementX => wrap_jso(JS("int", "#.webkitMovementX", this.raw));
+
+ @JSName('webkitMovementY')
+ @DomName('MouseEvent.webkitMovementY')
+ @DocsEditable()
+ @SupportedBrowser(SupportedBrowser.CHROME)
+ @SupportedBrowser(SupportedBrowser.SAFARI)
+ @Experimental()
+ int get _webkitMovementY => wrap_jso(JS("int", "#.webkitMovementY", this.raw));
+
+ @DomName('MouseEvent.initMouseEvent')
+ @DocsEditable()
+ void _initMouseEvent(String type, bool canBubble, bool cancelable, Window view, int detail, int screenX, int screenY, int clientX, int clientY, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey, int button, EventTarget relatedTarget) {
+ var relatedTarget_1 = _convertDartToNative_EventTarget(relatedTarget);
+ _initMouseEvent_1(type, canBubble, cancelable, view, detail, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey, button, relatedTarget_1);
+ return;
+ }
+ @JSName('initMouseEvent')
+ @DomName('MouseEvent.initMouseEvent')
+ @DocsEditable()
+ void _initMouseEvent_1(type, canBubble, cancelable, Window view, detail, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey, button, relatedTarget) => wrap_jso(JS("void ", "#.raw.initMouseEvent(#, #, #, #, #, #, #, #, #, #, #, #, #, #, #)", this, unwrap_jso(type), unwrap_jso(canBubble), unwrap_jso(cancelable), unwrap_jso(view), unwrap_jso(detail), unwrap_jso(screenX), unwrap_jso(screenY), unwrap_jso(clientX), unwrap_jso(clientY), unwrap_jso(ctrlKey), unwrap_jso(altKey), unwrap_jso(shiftKey), unwrap_jso(metaKey), unwrap_jso(button), unwrap_jso(relatedTarget)));
+}
+// 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.
+
+
+@DomName('Navigator')
+@Native("Navigator")
+class Navigator extends DartHtmlDomObject implements NavigatorCpu {
+
+
+
+
+ // To suppress missing implicit constructor warnings.
+ factory Navigator._() { throw new UnsupportedError("Not supported"); }
+
+ @Deprecated("Internal Use Only")
+ static Navigator internalCreateNavigator() {
+ return new Navigator.internal_();
+ }
+
+ @Deprecated("Internal Use Only")
+ Navigator.internal_() { }
+
+ bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+ int get hashCode => unwrap_jso(this).hashCode;
+
+ @DomName('Navigator.cookieEnabled')
+ @DocsEditable()
+ @Unstable()
+ bool get cookieEnabled => wrap_jso(JS("bool", "#.cookieEnabled", this.raw));
+
+ @DomName('Navigator.doNotTrack')
+ @DocsEditable()
+ // http://www.w3.org/2011/tracking-protection/drafts/tracking-dnt.html#js-dom
+ @Experimental() // experimental
+ String get doNotTrack => wrap_jso(JS("String", "#.doNotTrack", this.raw));
+
+ @DomName('Navigator.maxTouchPoints')
+ @DocsEditable()
+ @Experimental() // untriaged
+ int get maxTouchPoints => wrap_jso(JS("int", "#.maxTouchPoints", this.raw));
+
+ @DomName('Navigator.productSub')
+ @DocsEditable()
+ @Unstable()
+ String get productSub => wrap_jso(JS("String", "#.productSub", this.raw));
+
+ @DomName('Navigator.vendor')
+ @DocsEditable()
+ @Unstable()
+ String get vendor => wrap_jso(JS("String", "#.vendor", this.raw));
+
+ @DomName('Navigator.vendorSub')
+ @DocsEditable()
+ @Unstable()
+ String get vendorSub => wrap_jso(JS("String", "#.vendorSub", this.raw));
+
+ @DomName('Navigator.getBattery')
+ @DocsEditable()
+ @Experimental() // untriaged
+ Future getBattery() {
+ return _getBattery_1();
+ }
+ @JSName('getBattery')
+ @DomName('Navigator.getBattery')
+ @DocsEditable()
+ @Experimental() // untriaged
+ Future _getBattery_1() => wrap_jso(JS("Future ", "#.raw.getBattery()", this));
+
+ @DomName('Navigator.getStorageUpdates')
+ @DocsEditable()
+ // http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#navigatorstorageutils
+ @Experimental()
+ void getStorageUpdates() {
+ _getStorageUpdates_1();
+ return;
+ }
+ @JSName('getStorageUpdates')
+ @DomName('Navigator.getStorageUpdates')
+ @DocsEditable()
+ // http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#navigatorstorageutils
+ @Experimental()
+ void _getStorageUpdates_1() => wrap_jso(JS("void ", "#.raw.getStorageUpdates()", this));
+
+ @DomName('Navigator.registerProtocolHandler')
+ @DocsEditable()
+ @Unstable()
+ void registerProtocolHandler(String scheme, String url, String title) {
+ _registerProtocolHandler_1(scheme, url, title);
+ return;
+ }
+ @JSName('registerProtocolHandler')
+ @DomName('Navigator.registerProtocolHandler')
+ @DocsEditable()
+ @Unstable()
+ void _registerProtocolHandler_1(scheme, url, title) => wrap_jso(JS("void ", "#.raw.registerProtocolHandler(#, #, #)", this, unwrap_jso(scheme), unwrap_jso(url), unwrap_jso(title)));
+
+ @DomName('Navigator.sendBeacon')
+ @DocsEditable()
+ @Experimental() // untriaged
+ bool sendBeacon(String url, String data) {
+ return _sendBeacon_1(url, data);
+ }
+ @JSName('sendBeacon')
+ @DomName('Navigator.sendBeacon')
+ @DocsEditable()
+ @Experimental() // untriaged
+ bool _sendBeacon_1(url, data) => wrap_jso(JS("bool ", "#.raw.sendBeacon(#, #)", this, unwrap_jso(url), unwrap_jso(data)));
+
+ // From NavigatorCPU
+
+ @DomName('Navigator.hardwareConcurrency')
+ @DocsEditable()
+ @Experimental() // untriaged
+ int get hardwareConcurrency => wrap_jso(JS("int", "#.hardwareConcurrency", this.raw));
+
+}
+// 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.
+
+
+@DocsEditable()
+@DomName('NavigatorCPU')
+@Experimental() // untriaged
+abstract class NavigatorCpu extends DartHtmlDomObject {
+ // To suppress missing implicit constructor warnings.
+ factory NavigatorCpu._() { throw new UnsupportedError("Not supported"); }
+
+ int get hardwareConcurrency => wrap_jso(JS("int", "#.hardwareConcurrency", this.raw));
+}
+// 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.
+
+
+/**
+ * Lazy implementation of the child nodes of an element that does not request
+ * the actual child nodes of an element until strictly necessary greatly
+ * improving performance for the typical cases where it is not required.
+ */
+class _ChildNodeListLazy extends ListBase<Node> implements NodeListWrapper {
+ final Node _this;
+
+ _ChildNodeListLazy(this._this);
+
+
+ Node get first {
+ Node result = _this.firstChild;
+ if (result == null) throw new StateError("No elements");
+ return result;
+ }
+ Node get last {
+ Node result = _this.lastChild;
+ if (result == null) throw new StateError("No elements");
+ return result;
+ }
+ Node get single {
+ int l = this.length;
+ if (l == 0) throw new StateError("No elements");
+ if (l > 1) throw new StateError("More than one element");
+ return _this.firstChild;
+ }
+
+ void add(Node value) {
+ _this.append(value);
+ }
+
+ void addAll(Iterable<Node> iterable) {
+ if (iterable is _ChildNodeListLazy) {
+ _ChildNodeListLazy otherList = iterable;
+ if (!identical(otherList._this, _this)) {
+ // Optimized route for copying between nodes.
+ for (var i = 0, len = otherList.length; i < len; ++i) {
+ _this.append(otherList._this.firstChild);
+ }
+ }
+ return;
+ }
+ for (Node node in iterable) {
+ _this.append(node);
+ }
+ }
+
+ void insert(int index, Node node) {
+ if (index < 0 || index > length) {
+ throw new RangeError.range(index, 0, length);
+ }
+ if (index == length) {
+ _this.append(node);
+ } else {
+ _this.insertBefore(node, this[index]);
+ }
+ }
+
+ void insertAll(int index, Iterable<Node> iterable) {
+ if (index == length) {
+ addAll(iterable);
+ } else {
+ var item = this[index];
+ _this.insertAllBefore(iterable, item);
+ }
+ }
+
+ void setAll(int index, Iterable<Node> iterable) {
+ throw new UnsupportedError("Cannot setAll on Node list");
+ }
+
+ Node removeLast() {
+ final result = last;
+ if (result != null) {
+ _this._removeChild(result);
+ }
+ return result;
+ }
+
+ Node removeAt(int index) {
+ var result = this[index];
+ if (result != null) {
+ _this._removeChild(result);
+ }
+ return result;
+ }
+
+ bool remove(Object object) {
+ if (object is! Node) return false;
+ Node node = object;
+ // We aren't preserving identity of nodes in JSINTEROP mode
+ if (_this != node.parentNode) return false;
+ _this._removeChild(node);
+ return true;
+ }
+
+ void _filter(bool test(Node node), bool removeMatching) {
+ // This implementation of removeWhere/retainWhere is more efficient
+ // than the default in ListBase. Child nodes can be removed in constant
+ // time.
+ Node child = _this.firstChild;
+ while (child != null) {
+ Node nextChild = child.nextNode;
+ if (test(child) == removeMatching) {
+ _this._removeChild(child);
+ }
+ child = nextChild;
+ }
+ }
+
+ void removeWhere(bool test(Node node)) {
+ _filter(test, true);
+ }
+
+ void retainWhere(bool test(Node node)) {
+ _filter(test, false);
+ }
+
+ void clear() {
+ _this._clearChildren();
+ }
+
+ void operator []=(int index, Node value) {
+ _this._replaceChild(value, this[index]);
+ }
+
+ Iterator<Node> get iterator => _this.childNodes.iterator;
+
+ // From List<Node>:
+
+ // TODO(jacobr): this could be implemented for child node lists.
+ // The exception we throw here is misleading.
+ void sort([Comparator<Node> compare]) {
+ throw new UnsupportedError("Cannot sort Node list");
+ }
+
+ void shuffle([Random random]) {
+ throw new UnsupportedError("Cannot shuffle Node list");
+ }
+
+ // FIXME: implement these.
+ void setRange(int start, int end, Iterable<Node> iterable,
+ [int skipCount = 0]) {
+ throw new UnsupportedError("Cannot setRange on Node list");
+ }
+
+ void fillRange(int start, int end, [Node fill]) {
+ throw new UnsupportedError("Cannot fillRange on Node list");
+ }
+ // -- end List<Node> mixins.
+
+ // TODO(jacobr): benchmark whether this is more efficient or whether caching
+ // a local copy of childNodes is more efficient.
+ int get length => _this.childNodes.length;
+
+ set length(int value) {
+ throw new UnsupportedError(
+ "Cannot set length on immutable List.");
+ }
+
+ Node operator[](int index) => _this.childNodes[index];
+
+ List<Node> get rawList => _this.childNodes;
+}
+
+
+@DomName('Node')
+@Native("Node")
+class Node extends EventTarget {
+
+ // Custom element created callback.
+ Node._created() : super._created();
+
+ /**
+ * A modifiable list of this node's children.
+ */
+ List<Node> get nodes {
+ return new _ChildNodeListLazy(this);
+ }
+
+ set nodes(Iterable<Node> value) {
+ // Copy list first since we don't want liveness during iteration.
+ // TODO(jacobr): there is a better way to do this.
+ List copy = new List.from(value);
+ text = '';
+ for (Node node in copy) {
+ append(node);
+ }
+ }
+
+ /**
+ * Removes this node from the DOM.
+ */
+ @DomName('Node.removeChild')
+ void remove() {
+ // TODO(jacobr): should we throw an exception if parent is already null?
+ // TODO(vsm): Use the native remove when available.
+ if (this.parentNode != null) {
+ final Node parent = this.parentNode;
+ parentNode._removeChild(this);
+ }
+ }
+
+ /**
+ * Replaces this node with another node.
+ */
+ @DomName('Node.replaceChild')
+ Node replaceWith(Node otherNode) {
+ try {
+ final Node parent = this.parentNode;
+ parent._replaceChild(otherNode, this);
+ } catch (e) {
+
+ };
+ return this;
+ }
+
+ /**
+ * Inserts all of the nodes into this node directly before refChild.
+ *
+ * See also:
+ *
+ * * [insertBefore]
+ */
+ Node insertAllBefore(Iterable<Node> newNodes, Node refChild) {
+ if (newNodes is _ChildNodeListLazy) {
+ _ChildNodeListLazy otherList = newNodes;
+ if (identical(otherList._this, this)) {
+ throw new ArgumentError(newNodes);
+ }
+
+ // Optimized route for copying between nodes.
+ for (var i = 0, len = otherList.length; i < len; ++i) {
+ this.insertBefore(otherList._this.firstChild, refChild);
+ }
+ } else {
+ for (var node in newNodes) {
+ this.insertBefore(node, refChild);
+ }
+ }
+ }
+
+ void _clearChildren() {
+ while (firstChild != null) {
+ _removeChild(firstChild);
+ }
+ }
+
+ /**
+ * Print out a String representation of this Node.
+ */
+ String toString() {
+ String value = nodeValue; // Fetch DOM Node property once.
+ return value == null ? super.toString() : value;
+ }
+
+ /**
+ * A list of this node's children.
+ *
+ * ## Other resources
+ *
+ * * [Node.childNodes]
+ * (https://developer.mozilla.org/en-US/docs/Web/API/Node.childNodes)
+ * from MDN.
+ */
+ @DomName('Node.childNodes')
+ @DocsEditable()
+ List<Node> get childNodes => wrap_jso(JS('List', '#.childNodes', this.raw));
+ // To suppress missing implicit constructor warnings.
+ factory Node._() { throw new UnsupportedError("Not supported"); }
+
+
+ @Deprecated("Internal Use Only")
+ static Node internalCreateNode() {
+ return new Node.internal_();
+ }
+
+ @Deprecated("Internal Use Only")
+ Node.internal_() : super.internal_();
+
+
+ @DomName('Node.ATTRIBUTE_NODE')
+ @DocsEditable()
+ static const int ATTRIBUTE_NODE = 2;
+
+ @DomName('Node.CDATA_SECTION_NODE')
+ @DocsEditable()
+ static const int CDATA_SECTION_NODE = 4;
+
+ @DomName('Node.COMMENT_NODE')
+ @DocsEditable()
+ static const int COMMENT_NODE = 8;
+
+ @DomName('Node.DOCUMENT_FRAGMENT_NODE')
+ @DocsEditable()
+ static const int DOCUMENT_FRAGMENT_NODE = 11;
+
+ @DomName('Node.DOCUMENT_NODE')
+ @DocsEditable()
+ static const int DOCUMENT_NODE = 9;
+
+ @DomName('Node.DOCUMENT_TYPE_NODE')
+ @DocsEditable()
+ static const int DOCUMENT_TYPE_NODE = 10;
+
+ @DomName('Node.ELEMENT_NODE')
+ @DocsEditable()
+ static const int ELEMENT_NODE = 1;
+
+ @DomName('Node.ENTITY_NODE')
+ @DocsEditable()
+ static const int ENTITY_NODE = 6;
+
+ @DomName('Node.ENTITY_REFERENCE_NODE')
+ @DocsEditable()
+ static const int ENTITY_REFERENCE_NODE = 5;
+
+ @DomName('Node.NOTATION_NODE')
+ @DocsEditable()
+ static const int NOTATION_NODE = 12;
+
+ @DomName('Node.PROCESSING_INSTRUCTION_NODE')
+ @DocsEditable()
+ static const int PROCESSING_INSTRUCTION_NODE = 7;
+
+ @DomName('Node.TEXT_NODE')
+ @DocsEditable()
+ static const int TEXT_NODE = 3;
+
+ @JSName('baseURI')
+ @DomName('Node.baseURI')
+ @DocsEditable()
+ String get baseUri => wrap_jso(JS("String", "#.baseURI", this.raw));
+
+ /**
+ * The first child of this node.
+ *
+ * ## Other resources
+ *
+ * * [Node.firstChild]
+ * (https://developer.mozilla.org/en-US/docs/Web/API/Node.firstChild)
+ * from MDN.
+ */
+ @DomName('Node.firstChild')
+ @DocsEditable()
+ Node get firstChild => wrap_jso(JS("Node", "#.firstChild", this.raw));
+
+ /**
+ * The last child of this node.
+ *
+ * ## Other resources
+ *
+ * * [Node.lastChild]
+ * (https://developer.mozilla.org/en-US/docs/Web/API/Node.lastChild)
+ * from MDN.
+ */
+ @DomName('Node.lastChild')
+ @DocsEditable()
+ Node get lastChild => wrap_jso(JS("Node", "#.lastChild", this.raw));
+
+ @JSName('localName')
+ @DomName('Node.localName')
+ @DocsEditable()
+ String get _localName => wrap_jso(JS("String", "#.localName", this.raw));
+
+ @JSName('namespaceURI')
+ @DomName('Node.namespaceURI')
+ @DocsEditable()
+ String get _namespaceUri => wrap_jso(JS("String", "#.namespaceURI", this.raw));
+
+ @JSName('nextSibling')
+ /**
+ * The next sibling node.
+ *
+ * ## Other resources
+ *
+ * * [Node.nextSibling]
+ * (https://developer.mozilla.org/en-US/docs/Web/API/Node.nextSibling)
+ * from MDN.
+ */
+ @DomName('Node.nextSibling')
+ @DocsEditable()
+ Node get nextNode => wrap_jso(JS("Node", "#.nextSibling", this.raw));
+
+ /**
+ * The name of this node.
+ *
+ * This varies by this node's [nodeType].
+ *
+ * ## Other resources
+ *
+ * * [Node.nodeName]
+ * (https://developer.mozilla.org/en-US/docs/Web/API/Node.nodeName)
+ * from MDN. This page contains a table of [nodeName] values for each
+ * [nodeType].
+ */
+ @DomName('Node.nodeName')
+ @DocsEditable()
+ String get nodeName => wrap_jso(JS("String", "#.nodeName", this.raw));
+
+ /**
+ * The type of node.
+ *
+ * This value is one of:
+ *
+ * * [ATTRIBUTE_NODE] if this node is an attribute.
+ * * [CDATA_SECTION_NODE] if this node is a [CDataSection].
+ * * [COMMENT_NODE] if this node is a [Comment].
+ * * [DOCUMENT_FRAGMENT_NODE] if this node is a [DocumentFragment].
+ * * [DOCUMENT_NODE] if this node is a [Document].
+ * * [DOCUMENT_TYPE_NODE] if this node is a [DocumentType] node.
+ * * [ELEMENT_NODE] if this node is an [Element].
+ * * [ENTITY_NODE] if this node is an entity.
+ * * [ENTITY_REFERENCE_NODE] if this node is an entity reference.
+ * * [NOTATION_NODE] if this node is a notation.
+ * * [PROCESSING_INSTRUCTION_NODE] if this node is a [ProcessingInstruction].
+ * * [TEXT_NODE] if this node is a [Text] node.
+ *
+ * ## Other resources
+ *
+ * * [Node.nodeType]
+ * (https://developer.mozilla.org/en-US/docs/Web/API/Node.nodeType) from MDN.
+ */
+ @DomName('Node.nodeType')
+ @DocsEditable()
+ int get nodeType => wrap_jso(JS("int", "#.nodeType", this.raw));
+
+ /**
+ * The value of this node.
+ *
+ * This varies by this type's [nodeType].
+ *
+ * ## Other resources
+ *
+ * * [Node.nodeValue]
+ * (https://developer.mozilla.org/en-US/docs/Web/API/Node.nodeValue)
+ * from MDN. This page contains a table of [nodeValue] values for each
+ * [nodeType].
+ */
+ @DomName('Node.nodeValue')
+ @DocsEditable()
+ String get nodeValue => wrap_jso(JS("String", "#.nodeValue", this.raw));
+
+ /**
+ * The document this node belongs to.
+ *
+ * Returns null if this node does not belong to any document.
+ *
+ * ## Other resources
+ *
+ * * [Node.ownerDocument]
+ * (https://developer.mozilla.org/en-US/docs/Web/API/Node.ownerDocument) from
+ * MDN.
+ */
+ @DomName('Node.ownerDocument')
+ @DocsEditable()
+ Document get ownerDocument => wrap_jso(JS("Document", "#.ownerDocument", this.raw));
+
+ @JSName('parentElement')
+ /**
+ * The parent element of this node.
+ *
+ * Returns null if this node either does not have a parent or its parent is
+ * not an element.
+ *
+ * ## Other resources
+ *
+ * * [Node.parentElement]
+ * (https://developer.mozilla.org/en-US/docs/Web/API/Node.parentElement) from
+ * W3C.
+ */
+ @DomName('Node.parentElement')
+ @DocsEditable()
+ Element get parent => wrap_jso(JS("Element", "#.parentElement", this.raw));
+
+ /**
+ * The parent node of this node.
+ *
+ * ## Other resources
+ *
+ * * [Node.parentNode]
+ * (https://developer.mozilla.org/en-US/docs/Web/API/Node.parentNode) from
+ * MDN.
+ */
+ @DomName('Node.parentNode')
+ @DocsEditable()
+ Node get parentNode => wrap_jso(JS("Node", "#.parentNode", this.raw));
+
+ @JSName('previousSibling')
+ /**
+ * The previous sibling node.
+ *
+ * ## Other resources
+ *
+ * * [Node.previousSibling]
+ * (https://developer.mozilla.org/en-US/docs/Web/API/Node.previousSibling)
+ * from MDN.
+ */
+ @DomName('Node.previousSibling')
+ @DocsEditable()
+ Node get previousNode => wrap_jso(JS("Node", "#.previousSibling", this.raw));
+
+ @JSName('textContent')
+ /**
+ * All text within this node and its decendents.
+ *
+ * ## Other resources
+ *
+ * * [Node.textContent]
+ * (https://developer.mozilla.org/en-US/docs/Web/API/Node.textContent) from
+ * MDN.
+ */
+ @DomName('Node.textContent')
+ @DocsEditable()
+ String get text => wrap_jso(JS("String", "#.textContent", this.raw));
+ @JSName('textContent')
+ /**
+ * All text within this node and its decendents.
+ *
+ * ## Other resources
+ *
+ * * [Node.textContent]
+ * (https://developer.mozilla.org/en-US/docs/Web/API/Node.textContent) from
+ * MDN.
+ */
+ @DomName('Node.textContent')
+ @DocsEditable()
+ void set text(String val) => JS("void", "#.textContent = #", this.raw, unwrap_jso(val));
+
+ /**
+ * Adds a node to the end of the child [nodes] list of this node.
+ *
+ * If the node already exists in this document, it will be removed from its
+ * current parent node, then added to this node.
+ *
+ * This method is more efficient than `nodes.add`, and is the preferred
+ * way of appending a child node.
+ */
+ @DomName('Node.appendChild')
+ @DocsEditable()
+ Node append(Node newChild) {
+ return _append_1(newChild);
+ }
+ @JSName('appendChild')
+ /**
+ * Adds a node to the end of the child [nodes] list of this node.
+ *
+ * If the node already exists in this document, it will be removed from its
+ * current parent node, then added to this node.
+ *
+ * This method is more efficient than `nodes.add`, and is the preferred
+ * way of appending a child node.
+ */
+ @DomName('Node.appendChild')
+ @DocsEditable()
+ Node _append_1(Node newChild) => wrap_jso(JS("Node ", "#.raw.appendChild(#)", this, unwrap_jso(newChild)));
+
+ /**
+ * Returns a copy of this node.
+ *
+ * If [deep] is `true`, then all of this node's children and decendents are
+ * copied as well. If [deep] is `false`, then only this node is copied.
+ *
+ * ## Other resources
+ *
+ * * [Node.cloneNode]
+ * (https://developer.mozilla.org/en-US/docs/Web/API/Node.cloneNode) from
+ * MDN.
+ */
+ @DomName('Node.cloneNode')
+ @DocsEditable()
+ Node clone(bool deep) {
+ return _clone_1(deep);
+ }
+ @JSName('cloneNode')
+ /**
+ * Returns a copy of this node.
+ *
+ * If [deep] is `true`, then all of this node's children and decendents are
+ * copied as well. If [deep] is `false`, then only this node is copied.
+ *
+ * ## Other resources
+ *
+ * * [Node.cloneNode]
+ * (https://developer.mozilla.org/en-US/docs/Web/API/Node.cloneNode) from
+ * MDN.
+ */
+ @DomName('Node.cloneNode')
+ @DocsEditable()
+ Node _clone_1(deep) => wrap_jso(JS("Node ", "#.raw.cloneNode(#)", this, unwrap_jso(deep)));
+
+ /**
+ * Returns true if this node contains the specified node.
+ *
+ * ## Other resources
+ *
+ * * [Node.contains]
+ * (https://developer.mozilla.org/en-US/docs/Web/API/Node.contains) from MDN.
+ */
+ @DomName('Node.contains')
+ @DocsEditable()
+ bool contains(Node other) {
+ return _contains_1(other);
+ }
+ @JSName('contains')
+ /**
+ * Returns true if this node contains the specified node.
+ *
+ * ## Other resources
+ *
+ * * [Node.contains]
+ * (https://developer.mozilla.org/en-US/docs/Web/API/Node.contains) from MDN.
+ */
+ @DomName('Node.contains')
+ @DocsEditable()
+ bool _contains_1(Node other) => wrap_jso(JS("bool ", "#.raw.contains(#)", this, unwrap_jso(other)));
+
+ /**
+ * Returns true if this node has any children.
+ *
+ * ## Other resources
+ *
+ * * [Node.hasChildNodes]
+ * (https://developer.mozilla.org/en-US/docs/Web/API/Node.hasChildNodes) from
+ * MDN.
+ */
+ @DomName('Node.hasChildNodes')
+ @DocsEditable()
+ bool hasChildNodes() {
+ return _hasChildNodes_1();
+ }
+ @JSName('hasChildNodes')
+ /**
+ * Returns true if this node has any children.
+ *
+ * ## Other resources
+ *
+ * * [Node.hasChildNodes]
+ * (https://developer.mozilla.org/en-US/docs/Web/API/Node.hasChildNodes) from
+ * MDN.
+ */
+ @DomName('Node.hasChildNodes')
+ @DocsEditable()
+ bool _hasChildNodes_1() => wrap_jso(JS("bool ", "#.raw.hasChildNodes()", this));
+
+ /**
+ * Inserts all of the nodes into this node directly before refChild.
+ *
+ * ## Other resources
+ *
+ * * [Node.insertBefore]
+ * (https://developer.mozilla.org/en-US/docs/Web/API/Node.insertBefore) from
+ * MDN.
+ */
+ @DomName('Node.insertBefore')
+ @DocsEditable()
+ Node insertBefore(Node newChild, Node refChild) {
+ return _insertBefore_1(newChild, refChild);
+ }
+ @JSName('insertBefore')
+ /**
+ * Inserts all of the nodes into this node directly before refChild.
+ *
+ * ## Other resources
+ *
+ * * [Node.insertBefore]
+ * (https://developer.mozilla.org/en-US/docs/Web/API/Node.insertBefore) from
+ * MDN.
+ */
+ @DomName('Node.insertBefore')
+ @DocsEditable()
+ Node _insertBefore_1(Node newChild, Node refChild) => wrap_jso(JS("Node ", "#.raw.insertBefore(#, #)", this, unwrap_jso(newChild), unwrap_jso(refChild)));
+
+ @DomName('Node.removeChild')
+ @DocsEditable()
+ Node _removeChild(Node oldChild) {
+ return _removeChild_1(oldChild);
+ }
+ @JSName('removeChild')
+ @DomName('Node.removeChild')
+ @DocsEditable()
+ Node _removeChild_1(Node oldChild) => wrap_jso(JS("Node ", "#.raw.removeChild(#)", this, unwrap_jso(oldChild)));
+
+ @DomName('Node.replaceChild')
+ @DocsEditable()
+ Node _replaceChild(Node newChild, Node oldChild) {
+ return _replaceChild_1(newChild, oldChild);
+ }
+ @JSName('replaceChild')
+ @DomName('Node.replaceChild')
+ @DocsEditable()
+ Node _replaceChild_1(Node newChild, Node oldChild) => wrap_jso(JS("Node ", "#.raw.replaceChild(#, #)", this, unwrap_jso(newChild), unwrap_jso(oldChild)));
+
+}
+// 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.
+
+
+@DocsEditable()
+@DomName('NodeList')
+@Native("NodeList,RadioNodeList")
+class NodeList extends DartHtmlDomObject with ListMixin<Node>, ImmutableListMixin<Node> implements JavaScriptIndexingBehavior, List<Node> {
+ // To suppress missing implicit constructor warnings.
+ factory NodeList._() { throw new UnsupportedError("Not supported"); }
+
+ @Deprecated("Internal Use Only")
+ static NodeList internalCreateNodeList() {
+ return new NodeList.internal_();
+ }
+
+ @Deprecated("Internal Use Only")
+ NodeList.internal_() { }
+
+ bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+ int get hashCode => unwrap_jso(this).hashCode;
+
+ @DomName('NodeList.length')
+ @DocsEditable()
+ int get length => wrap_jso(JS("int", "#.length", this.raw));
+
+ Node operator[](int index) {
+ if (JS("bool", "# >>> 0 !== # || # >= #", index,
+ index, index, length))
+ throw new RangeError.index(index, this);
+ return wrap_jso(JS("Node", "#[#]", this.raw, index));
+ }
+ void operator[]=(int index, Node value) {
+ throw new UnsupportedError("Cannot assign element of immutable List.");
+ }
+ // -- start List<Node> mixins.
+ // Node is the element type.
+
+
+ set length(int value) {
+ throw new UnsupportedError("Cannot resize immutable List.");
+ }
+
+ Node get first {
+ if (this.length > 0) {
+ return wrap_jso(JS('Node', '#[0]', this.raw));
+ }
+ throw new StateError("No elements");
+ }
+
+ Node get last {
+ int len = this.length;
+ if (len > 0) {
+ return wrap_jso(JS('Node', '#[#]', this.raw, len - 1));
+ }
+ throw new StateError("No elements");
+ }
+
+ Node get single {
+ int len = this.length;
+ if (len == 1) {
+ return wrap_jso(JS('Node', '#[0]', this.raw));
+ }
+ if (len == 0) throw new StateError("No elements");
+ throw new StateError("More than one element");
+ }
+
+ Node elementAt(int index) => this[index];
+ // -- end List<Node> mixins.
+
+ @DomName('NodeList.item')
+ @DocsEditable()
+ Node _item(int index) {
+ return _item_1(index);
+ }
+ @JSName('item')
+ @DomName('NodeList.item')
+ @DocsEditable()
+ Node _item_1(index) => wrap_jso(JS("Node ", "#.raw.item(#)", this, unwrap_jso(index)));
+}
+// 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.
+
+
+@DocsEditable()
+@DomName('ParentNode')
+@Experimental() // untriaged
+abstract class ParentNode extends DartHtmlDomObject {
+ // To suppress missing implicit constructor warnings.
+ factory ParentNode._() { throw new UnsupportedError("Not supported"); }
+
+ int get _childElementCount => wrap_jso(JS("int", "#.childElementCount", this.raw));
+
+ List<Node> get _children => wrap_jso(JS("List<Node>", "#.children", this.raw));
+
+ Element get _firstElementChild => wrap_jso(JS("Element", "#.firstElementChild", this.raw));
+
+ Element get _lastElementChild => wrap_jso(JS("Element", "#.lastElementChild", this.raw));
+
+ Element querySelector(String selectors) => wrap_jso(JS("Element", "#.raw.querySelector(#)", this, unwrap_jso(selectors)));
+
+ List<Node> _querySelectorAll(String selectors) => wrap_jso(JS("List<Node>", "#.raw.querySelectorAll(#)", this, unwrap_jso(selectors)));
+}
+// 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.
+
+
+@DocsEditable()
+@DomName('ProgressEvent')
+@Native("ProgressEvent")
+class ProgressEvent extends Event {
+ // To suppress missing implicit constructor warnings.
+ factory ProgressEvent._() { throw new UnsupportedError("Not supported"); }
+
+
+ @Deprecated("Internal Use Only")
+ static ProgressEvent internalCreateProgressEvent() {
+ return new ProgressEvent.internal_();
+ }
+
+ @Deprecated("Internal Use Only")
+ ProgressEvent.internal_() : super.internal_();
+
+
+ @DomName('ProgressEvent.lengthComputable')
+ @DocsEditable()
+ bool get lengthComputable => wrap_jso(JS("bool", "#.lengthComputable", this.raw));
+
+ @DomName('ProgressEvent.loaded')
+ @DocsEditable()
+ int get loaded => wrap_jso(JS("int", "#.loaded", this.raw));
+
+ @DomName('ProgressEvent.total')
+ @DocsEditable()
+ int get total => wrap_jso(JS("int", "#.total", this.raw));
+}
+// 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.
+
+// WARNING: Do not edit - generated code.
+
+
+@DomName('Range')
+@Unstable()
+@Native("Range")
+class Range extends DartHtmlDomObject {
+ factory Range() => document.createRange();
+
+ factory Range.fromPoint(Point point) =>
+ document._caretRangeFromPoint(point.x, point.y);
+ // To suppress missing implicit constructor warnings.
+ factory Range._() { throw new UnsupportedError("Not supported"); }
+
+ @Deprecated("Internal Use Only")
+ static Range internalCreateRange() {
+ return new Range.internal_();
+ }
+
+ @Deprecated("Internal Use Only")
+ Range.internal_() { }
+
+ bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+ int get hashCode => unwrap_jso(this).hashCode;
+
+ @DomName('Range.END_TO_END')
+ @DocsEditable()
+ static const int END_TO_END = 2;
+
+ @DomName('Range.END_TO_START')
+ @DocsEditable()
+ static const int END_TO_START = 3;
+
+ @DomName('Range.NODE_AFTER')
+ @DocsEditable()
+ @Experimental() // nonstandard
+ static const int NODE_AFTER = 1;
+
+ @DomName('Range.NODE_BEFORE')
+ @DocsEditable()
+ @Experimental() // nonstandard
+ static const int NODE_BEFORE = 0;
+
+ @DomName('Range.NODE_BEFORE_AND_AFTER')
+ @DocsEditable()
+ @Experimental() // nonstandard
+ static const int NODE_BEFORE_AND_AFTER = 2;
+
+ @DomName('Range.NODE_INSIDE')
+ @DocsEditable()
+ @Experimental() // nonstandard
+ static const int NODE_INSIDE = 3;
+
+ @DomName('Range.START_TO_END')
+ @DocsEditable()
+ static const int START_TO_END = 1;
+
+ @DomName('Range.START_TO_START')
+ @DocsEditable()
+ static const int START_TO_START = 0;
+
+ @DomName('Range.collapsed')
+ @DocsEditable()
+ bool get collapsed => wrap_jso(JS("bool", "#.collapsed", this.raw));
+
+ @DomName('Range.commonAncestorContainer')
+ @DocsEditable()
+ Node get commonAncestorContainer => wrap_jso(JS("Node", "#.commonAncestorContainer", this.raw));
+
+ @DomName('Range.endContainer')
+ @DocsEditable()
+ Node get endContainer => wrap_jso(JS("Node", "#.endContainer", this.raw));
+
+ @DomName('Range.endOffset')
+ @DocsEditable()
+ int get endOffset => wrap_jso(JS("int", "#.endOffset", this.raw));
+
+ @DomName('Range.startContainer')
+ @DocsEditable()
+ Node get startContainer => wrap_jso(JS("Node", "#.startContainer", this.raw));
+
+ @DomName('Range.startOffset')
+ @DocsEditable()
+ int get startOffset => wrap_jso(JS("int", "#.startOffset", this.raw));
+
+ @DomName('Range.cloneContents')
+ @DocsEditable()
+ DocumentFragment cloneContents() {
+ return _cloneContents_1();
+ }
+ @JSName('cloneContents')
+ @DomName('Range.cloneContents')
+ @DocsEditable()
+ DocumentFragment _cloneContents_1() => wrap_jso(JS("DocumentFragment ", "#.raw.cloneContents()", this));
+
+ @DomName('Range.cloneRange')
+ @DocsEditable()
+ Range cloneRange() {
+ return _cloneRange_1();
+ }
+ @JSName('cloneRange')
+ @DomName('Range.cloneRange')
+ @DocsEditable()
+ Range _cloneRange_1() => wrap_jso(JS("Range ", "#.raw.cloneRange()", this));
+
+ @DomName('Range.collapse')
+ @DocsEditable()
+ void collapse([bool toStart]) {
+ if (toStart != null) {
+ _collapse_1(toStart);
+ return;
+ }
+ _collapse_2();
+ return;
+ }
+ @JSName('collapse')
+ @DomName('Range.collapse')
+ @DocsEditable()
+ void _collapse_1(toStart) => wrap_jso(JS("void ", "#.raw.collapse(#)", this, unwrap_jso(toStart)));
+ @JSName('collapse')
+ @DomName('Range.collapse')
+ @DocsEditable()
+ void _collapse_2() => wrap_jso(JS("void ", "#.raw.collapse()", this));
+
+ @DomName('Range.compareBoundaryPoints')
+ @DocsEditable()
+ @Experimental() // untriaged
+ int compareBoundaryPoints(int how, Range sourceRange) {
+ return _compareBoundaryPoints_1(how, sourceRange);
+ }
+ @JSName('compareBoundaryPoints')
+ @DomName('Range.compareBoundaryPoints')
+ @DocsEditable()
+ @Experimental() // untriaged
+ int _compareBoundaryPoints_1(how, Range sourceRange) => wrap_jso(JS("int ", "#.raw.compareBoundaryPoints(#, #)", this, unwrap_jso(how), unwrap_jso(sourceRange)));
+
+ @DomName('Range.comparePoint')
+ @DocsEditable()
+ int comparePoint(Node refNode, int offset) {
+ return _comparePoint_1(refNode, offset);
+ }
+ @JSName('comparePoint')
+ @DomName('Range.comparePoint')
+ @DocsEditable()
+ int _comparePoint_1(Node refNode, offset) => wrap_jso(JS("int ", "#.raw.comparePoint(#, #)", this, unwrap_jso(refNode), unwrap_jso(offset)));
+
+ @DomName('Range.createContextualFragment')
+ @DocsEditable()
+ DocumentFragment createContextualFragment(String html) {
+ return _createContextualFragment_1(html);
+ }
+ @JSName('createContextualFragment')
+ @DomName('Range.createContextualFragment')
+ @DocsEditable()
+ DocumentFragment _createContextualFragment_1(html) => wrap_jso(JS("DocumentFragment ", "#.raw.createContextualFragment(#)", this, unwrap_jso(html)));
+
+ @DomName('Range.deleteContents')
+ @DocsEditable()
+ void deleteContents() {
+ _deleteContents_1();
+ return;
+ }
+ @JSName('deleteContents')
+ @DomName('Range.deleteContents')
+ @DocsEditable()
+ void _deleteContents_1() => wrap_jso(JS("void ", "#.raw.deleteContents()", this));
+
+ @DomName('Range.detach')
+ @DocsEditable()
+ void detach() {
+ _detach_1();
+ return;
+ }
+ @JSName('detach')
+ @DomName('Range.detach')
+ @DocsEditable()
+ void _detach_1() => wrap_jso(JS("void ", "#.raw.detach()", this));
+
+ @DomName('Range.expand')
+ @DocsEditable()
+ @Experimental() // non-standard
+ void expand(String unit) {
+ _expand_1(unit);
+ return;
+ }
+ @JSName('expand')
+ @DomName('Range.expand')
+ @DocsEditable()
+ @Experimental() // non-standard
+ void _expand_1(unit) => wrap_jso(JS("void ", "#.raw.expand(#)", this, unwrap_jso(unit)));
+
+ @DomName('Range.extractContents')
+ @DocsEditable()
+ DocumentFragment extractContents() {
+ return _extractContents_1();
+ }
+ @JSName('extractContents')
+ @DomName('Range.extractContents')
+ @DocsEditable()
+ DocumentFragment _extractContents_1() => wrap_jso(JS("DocumentFragment ", "#.raw.extractContents()", this));
+
+ @DomName('Range.getBoundingClientRect')
+ @DocsEditable()
+ Rectangle getBoundingClientRect() {
+ return _getBoundingClientRect_1();
+ }
+ @JSName('getBoundingClientRect')
+ @DomName('Range.getBoundingClientRect')
+ @DocsEditable()
+ Rectangle _getBoundingClientRect_1() => wrap_jso(JS("Rectangle ", "#.raw.getBoundingClientRect()", this));
+
+ @DomName('Range.insertNode')
+ @DocsEditable()
+ void insertNode(Node newNode) {
+ _insertNode_1(newNode);
+ return;
+ }
+ @JSName('insertNode')
+ @DomName('Range.insertNode')
+ @DocsEditable()
+ void _insertNode_1(Node newNode) => wrap_jso(JS("void ", "#.raw.insertNode(#)", this, unwrap_jso(newNode)));
+
+ @DomName('Range.isPointInRange')
+ @DocsEditable()
+ bool isPointInRange(Node refNode, int offset) {
+ return _isPointInRange_1(refNode, offset);
+ }
+ @JSName('isPointInRange')
+ @DomName('Range.isPointInRange')
+ @DocsEditable()
+ bool _isPointInRange_1(Node refNode, offset) => wrap_jso(JS("bool ", "#.raw.isPointInRange(#, #)", this, unwrap_jso(refNode), unwrap_jso(offset)));
+
+ @DomName('Range.selectNode')
+ @DocsEditable()
+ void selectNode(Node refNode) {
+ _selectNode_1(refNode);
+ return;
+ }
+ @JSName('selectNode')
+ @DomName('Range.selectNode')
+ @DocsEditable()
+ void _selectNode_1(Node refNode) => wrap_jso(JS("void ", "#.raw.selectNode(#)", this, unwrap_jso(refNode)));
+
+ @DomName('Range.selectNodeContents')
+ @DocsEditable()
+ void selectNodeContents(Node refNode) {
+ _selectNodeContents_1(refNode);
+ return;
+ }
+ @JSName('selectNodeContents')
+ @DomName('Range.selectNodeContents')
+ @DocsEditable()
+ void _selectNodeContents_1(Node refNode) => wrap_jso(JS("void ", "#.raw.selectNodeContents(#)", this, unwrap_jso(refNode)));
+
+ @DomName('Range.setEnd')
+ @DocsEditable()
+ void setEnd(Node refNode, int offset) {
+ _setEnd_1(refNode, offset);
+ return;
+ }
+ @JSName('setEnd')
+ @DomName('Range.setEnd')
+ @DocsEditable()
+ void _setEnd_1(Node refNode, offset) => wrap_jso(JS("void ", "#.raw.setEnd(#, #)", this, unwrap_jso(refNode), unwrap_jso(offset)));
+
+ @DomName('Range.setEndAfter')
+ @DocsEditable()
+ void setEndAfter(Node refNode) {
+ _setEndAfter_1(refNode);
+ return;
+ }
+ @JSName('setEndAfter')
+ @DomName('Range.setEndAfter')
+ @DocsEditable()
+ void _setEndAfter_1(Node refNode) => wrap_jso(JS("void ", "#.raw.setEndAfter(#)", this, unwrap_jso(refNode)));
+
+ @DomName('Range.setEndBefore')
+ @DocsEditable()
+ void setEndBefore(Node refNode) {
+ _setEndBefore_1(refNode);
+ return;
+ }
+ @JSName('setEndBefore')
+ @DomName('Range.setEndBefore')
+ @DocsEditable()
+ void _setEndBefore_1(Node refNode) => wrap_jso(JS("void ", "#.raw.setEndBefore(#)", this, unwrap_jso(refNode)));
+
+ @DomName('Range.setStart')
+ @DocsEditable()
+ void setStart(Node refNode, int offset) {
+ _setStart_1(refNode, offset);
+ return;
+ }
+ @JSName('setStart')
+ @DomName('Range.setStart')
+ @DocsEditable()
+ void _setStart_1(Node refNode, offset) => wrap_jso(JS("void ", "#.raw.setStart(#, #)", this, unwrap_jso(refNode), unwrap_jso(offset)));
+
+ @DomName('Range.setStartAfter')
+ @DocsEditable()
+ void setStartAfter(Node refNode) {
+ _setStartAfter_1(refNode);
+ return;
+ }
+ @JSName('setStartAfter')
+ @DomName('Range.setStartAfter')
+ @DocsEditable()
+ void _setStartAfter_1(Node refNode) => wrap_jso(JS("void ", "#.raw.setStartAfter(#)", this, unwrap_jso(refNode)));
+
+ @DomName('Range.setStartBefore')
+ @DocsEditable()
+ void setStartBefore(Node refNode) {
+ _setStartBefore_1(refNode);
+ return;
+ }
+ @JSName('setStartBefore')
+ @DomName('Range.setStartBefore')
+ @DocsEditable()
+ void _setStartBefore_1(Node refNode) => wrap_jso(JS("void ", "#.raw.setStartBefore(#)", this, unwrap_jso(refNode)));
+
+ @DomName('Range.surroundContents')
+ @DocsEditable()
+ void surroundContents(Node newParent) {
+ _surroundContents_1(newParent);
+ return;
+ }
+ @JSName('surroundContents')
+ @DomName('Range.surroundContents')
+ @DocsEditable()
+ void _surroundContents_1(Node newParent) => wrap_jso(JS("void ", "#.raw.surroundContents(#)", this, unwrap_jso(newParent)));
+
+
+ /**
+ * Checks if createContextualFragment is supported.
+ *
+ * See also:
+ *
+ * * [createContextualFragment]
+ */
+ static bool get supportsCreateContextualFragment => true;
+}
+// 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.
+
+// WARNING: Do not edit - generated code.
+
+
+@DomName('RequestAnimationFrameCallback')
+typedef void RequestAnimationFrameCallback(num highResTime);
+// 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.
+
+// WARNING: Do not edit - generated code.
+
+
+@DomName('ShadowRoot')
+@SupportedBrowser(SupportedBrowser.CHROME, '26')
+@Experimental()
+// https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#api-shadow-root
+@Native("ShadowRoot")
+class ShadowRoot extends DocumentFragment {
+ // To suppress missing implicit constructor warnings.
+ factory ShadowRoot._() { throw new UnsupportedError("Not supported"); }
+
+
+ @Deprecated("Internal Use Only")
+ static ShadowRoot internalCreateShadowRoot() {
+ return new ShadowRoot.internal_();
+ }
+
+ @Deprecated("Internal Use Only")
+ ShadowRoot.internal_() : super.internal_();
+
+
+ @DomName('ShadowRoot.activeElement')
+ @DocsEditable()
+ Element get activeElement => wrap_jso(JS("Element", "#.activeElement", this.raw));
+
+ @DomName('ShadowRoot.host')
+ @DocsEditable()
+ @Experimental() // untriaged
+ Element get host => wrap_jso(JS("Element", "#.host", this.raw));
+
+ @JSName('innerHTML')
+ @DomName('ShadowRoot.innerHTML')
+ @DocsEditable()
+ String get innerHtml => wrap_jso(JS("String", "#.innerHTML", this.raw));
+ @JSName('innerHTML')
+ @DomName('ShadowRoot.innerHTML')
+ @DocsEditable()
+ void set innerHtml(String val) => JS("void", "#.innerHTML = #", this.raw, unwrap_jso(val));
+
+ @DomName('ShadowRoot.olderShadowRoot')
+ @DocsEditable()
+ @Experimental() // untriaged
+ ShadowRoot get olderShadowRoot => wrap_jso(JS("ShadowRoot", "#.olderShadowRoot", this.raw));
+
+ @DomName('ShadowRoot.cloneNode')
+ @DocsEditable()
+ Node clone(bool deep) {
+ return _clone_1(deep);
+ }
+ @JSName('cloneNode')
+ @DomName('ShadowRoot.cloneNode')
+ @DocsEditable()
+ Node _clone_1(deep) => wrap_jso(JS("Node ", "#.raw.cloneNode(#)", this, unwrap_jso(deep)));
+
+ @DomName('ShadowRoot.elementFromPoint')
+ @DocsEditable()
+ Element elementFromPoint(int x, int y) {
+ return _elementFromPoint_1(x, y);
+ }
+ @JSName('elementFromPoint')
+ @DomName('ShadowRoot.elementFromPoint')
+ @DocsEditable()
+ Element _elementFromPoint_1(x, y) => wrap_jso(JS("Element ", "#.raw.elementFromPoint(#, #)", this, unwrap_jso(x), unwrap_jso(y)));
+
+ @DomName('ShadowRoot.getElementsByClassName')
+ @DocsEditable()
+ @Creates('NodeList|HtmlCollection')
+ @Returns('NodeList|HtmlCollection')
+ HtmlCollection getElementsByClassName(String className) {
+ return _getElementsByClassName_1(className);
+ }
+ @JSName('getElementsByClassName')
+ @DomName('ShadowRoot.getElementsByClassName')
+ @DocsEditable()
+ @Creates('NodeList|HtmlCollection')
+ @Returns('NodeList|HtmlCollection')
+ HtmlCollection _getElementsByClassName_1(className) => wrap_jso(JS("HtmlCollection ", "#.raw.getElementsByClassName(#)", this, unwrap_jso(className)));
+
+ @DomName('ShadowRoot.getElementsByTagName')
+ @DocsEditable()
+ @Creates('NodeList|HtmlCollection')
+ @Returns('NodeList|HtmlCollection')
+ HtmlCollection getElementsByTagName(String tagName) {
+ return _getElementsByTagName_1(tagName);
+ }
+ @JSName('getElementsByTagName')
+ @DomName('ShadowRoot.getElementsByTagName')
+ @DocsEditable()
+ @Creates('NodeList|HtmlCollection')
+ @Returns('NodeList|HtmlCollection')
+ HtmlCollection _getElementsByTagName_1(tagName) => wrap_jso(JS("HtmlCollection ", "#.raw.getElementsByTagName(#)", this, unwrap_jso(tagName)));
+
+ static final bool supported = true;
+
+ static bool _shadowRootDeprecationReported = false;
+ static void _shadowRootDeprecationReport() {
+ if (!_shadowRootDeprecationReported) {
+ window.console.warn('''
+ShadowRoot.resetStyleInheritance and ShadowRoot.applyAuthorStyles now deprecated in dart:html.
+Please remove them from your code.
+''');
+ _shadowRootDeprecationReported = true;
+ }
+ }
+
+ @deprecated
+ bool get resetStyleInheritance {
+ _shadowRootDeprecationReport();
+ // Default value from when it was specified.
+ return false;
+ }
+
+ @deprecated
+ set resetStyleInheritance(bool value) {
+ _shadowRootDeprecationReport();
+ }
+
+ @deprecated
+ bool get applyAuthorStyles {
+ _shadowRootDeprecationReport();
+ // Default value from when it was specified.
+ return false;
+ }
+
+ @deprecated
+ set applyAuthorStyles(bool value) {
+ _shadowRootDeprecationReport();
+ }
+}
+// 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.
+
+
+@DocsEditable()
+@DomName('HTMLStyleElement')
+@Native("HTMLStyleElement")
+class StyleElement extends HtmlElement {
+ // To suppress missing implicit constructor warnings.
+ factory StyleElement._() { throw new UnsupportedError("Not supported"); }
+
+ @DomName('HTMLStyleElement.HTMLStyleElement')
+ @DocsEditable()
+ factory StyleElement() => document.createElement("style");
+
+
+ @Deprecated("Internal Use Only")
+ static StyleElement internalCreateStyleElement() {
+ return new StyleElement.internal_();
+ }
+
+ @Deprecated("Internal Use Only")
+ StyleElement.internal_() : super.internal_();
+
+
+ @DomName('HTMLStyleElement.disabled')
+ @DocsEditable()
+ bool get disabled => wrap_jso(JS("bool", "#.disabled", this.raw));
+ @DomName('HTMLStyleElement.disabled')
+ @DocsEditable()
+ void set disabled(bool val) => JS("void", "#.disabled = #", this.raw, unwrap_jso(val));
+
+ @DomName('HTMLStyleElement.media')
+ @DocsEditable()
+ String get media => wrap_jso(JS("String", "#.media", this.raw));
+ @DomName('HTMLStyleElement.media')
+ @DocsEditable()
+ void set media(String val) => JS("void", "#.media = #", this.raw, unwrap_jso(val));
+
+ @DomName('HTMLStyleElement.type')
+ @DocsEditable()
+ String get type => wrap_jso(JS("String", "#.type", this.raw));
+ @DomName('HTMLStyleElement.type')
+ @DocsEditable()
+ void set type(String val) => JS("void", "#.type = #", this.raw, unwrap_jso(val));
+}
+// Copyright (c) 2013, 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.
+
+// WARNING: Do not edit - generated code.
+
+
+@Experimental()
+@DomName('HTMLTemplateElement')
+@SupportedBrowser(SupportedBrowser.CHROME)
+@Experimental()
+// https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/templates/index.html#template-element
+@Native("HTMLTemplateElement")
+class TemplateElement extends HtmlElement {
+ // To suppress missing implicit constructor warnings.
+ factory TemplateElement._() { throw new UnsupportedError("Not supported"); }
+
+ @DomName('HTMLTemplateElement.HTMLTemplateElement')
+ @DocsEditable()
+ factory TemplateElement() => document.createElement("template");
+
+
+ @Deprecated("Internal Use Only")
+ static TemplateElement internalCreateTemplateElement() {
+ return new TemplateElement.internal_();
+ }
+
+ @Deprecated("Internal Use Only")
+ TemplateElement.internal_() : super.internal_();
+
+
+ /// Checks if this type is supported on the current platform.
+ static bool get supported => Element.isTagSupported('template');
+
+ @DomName('HTMLTemplateElement.content')
+ @DocsEditable()
+ DocumentFragment get content => wrap_jso(JS("DocumentFragment", "#.content", this.raw));
+
+
+ /**
+ * An override to place the contents into content rather than as child nodes.
+ *
+ * See also:
+ *
+ * * <https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/templates/index.html#innerhtml-on-templates>
+ */
+ void setInnerHtml(String html,
+ {NodeValidator validator, NodeTreeSanitizer treeSanitizer}) {
+ text = null;
+ var fragment = createFragment(
+ html, validator: validator, treeSanitizer: treeSanitizer);
+
+ content.append(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.
+
+// WARNING: Do not edit - generated code.
+
+
+@DomName('Text')
+@Native("Text")
+class Text extends CharacterData {
+ factory Text(String data) => document._createTextNode(data);
+ // To suppress missing implicit constructor warnings.
+ factory Text._() { throw new UnsupportedError("Not supported"); }
+
+
+ @Deprecated("Internal Use Only")
+ static Text internalCreateText() {
+ return new Text.internal_();
+ }
+
+ @Deprecated("Internal Use Only")
+ Text.internal_() : super.internal_();
+
+
+ @DomName('Text.wholeText')
+ @DocsEditable()
+ String get wholeText => wrap_jso(JS("String", "#.wholeText", this.raw));
+
+ @DomName('Text.getDestinationInsertionPoints')
+ @DocsEditable()
+ @Experimental() // untriaged
+ @Returns('NodeList')
+ @Creates('NodeList')
+ NodeList getDestinationInsertionPoints() {
+ return _getDestinationInsertionPoints_1();
+ }
+ @JSName('getDestinationInsertionPoints')
+ @DomName('Text.getDestinationInsertionPoints')
+ @DocsEditable()
+ @Experimental() // untriaged
+ @Returns('NodeList')
+ @Creates('NodeList')
+ NodeList _getDestinationInsertionPoints_1() => wrap_jso(JS("NodeList ", "#.raw.getDestinationInsertionPoints()", this));
+
+ @DomName('Text.splitText')
+ @DocsEditable()
+ Text splitText(int offset) {
+ return _splitText_1(offset);
+ }
+ @JSName('splitText')
+ @DomName('Text.splitText')
+ @DocsEditable()
+ Text _splitText_1(offset) => wrap_jso(JS("Text ", "#.raw.splitText(#)", this, unwrap_jso(offset)));
+
+}
+// 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.
+
+// WARNING: Do not edit - generated code.
+
+
+@DomName('UIEvent')
+@Native("UIEvent")
+class UIEvent extends Event {
+ // In JS, canBubble and cancelable are technically required parameters to
+ // init*Event. In practice, though, if they aren't provided they simply
+ // default to false (since that's Boolean(undefined)).
+ //
+ // Contrary to JS, we default canBubble and cancelable to true, since that's
+ // what people want most of the time anyway.
+ factory UIEvent(String type,
+ {Window view, int detail: 0, bool canBubble: true,
+ bool cancelable: true}) {
+ if (view == null) {
+ view = window;
+ }
+ UIEvent e = document._createEvent("UIEvent");
+ e._initUIEvent(type, canBubble, cancelable, view, detail);
+ return e;
+ }
+ // To suppress missing implicit constructor warnings.
+ factory UIEvent._() { throw new UnsupportedError("Not supported"); }
+
+
+ @Deprecated("Internal Use Only")
+ static UIEvent internalCreateUIEvent() {
+ return new UIEvent.internal_();
+ }
+
+ @Deprecated("Internal Use Only")
+ UIEvent.internal_() : super.internal_();
+
+
+ @JSName('charCode')
+ @DomName('UIEvent.charCode')
+ @DocsEditable()
+ @Unstable()
+ int get _charCode => wrap_jso(JS("int", "#.charCode", this.raw));
+
+ @DomName('UIEvent.detail')
+ @DocsEditable()
+ int get detail => wrap_jso(JS("int", "#.detail", this.raw));
+
+ @JSName('keyCode')
+ @DomName('UIEvent.keyCode')
+ @DocsEditable()
+ @Unstable()
+ int get _keyCode => wrap_jso(JS("int", "#.keyCode", this.raw));
+
+ @JSName('layerX')
+ @DomName('UIEvent.layerX')
+ @DocsEditable()
+ // http://dev.w3.org/2006/webapi/DOM-Level-3-Events/html/DOM3-Events.html#events-mouseevents
+ @Experimental() // nonstandard
+ int get _layerX => wrap_jso(JS("int", "#.layerX", this.raw));
+
+ @JSName('layerY')
+ @DomName('UIEvent.layerY')
+ @DocsEditable()
+ // http://dev.w3.org/2006/webapi/DOM-Level-3-Events/html/DOM3-Events.html#events-mouseevents
+ @Experimental() // nonstandard
+ int get _layerY => wrap_jso(JS("int", "#.layerY", this.raw));
+
+ @JSName('pageX')
+ @DomName('UIEvent.pageX')
+ @DocsEditable()
+ // http://dev.w3.org/2006/webapi/DOM-Level-3-Events/html/DOM3-Events.html#events-mouseevents
+ @Experimental() // nonstandard
+ int get _pageX => wrap_jso(JS("int", "#.pageX", this.raw));
+
+ @JSName('pageY')
+ @DomName('UIEvent.pageY')
+ @DocsEditable()
+ // http://dev.w3.org/2006/webapi/DOM-Level-3-Events/html/DOM3-Events.html#events-mouseevents
+ @Experimental() // nonstandard
+ int get _pageY => wrap_jso(JS("int", "#.pageY", this.raw));
+
+ @DomName('UIEvent.view')
+ @DocsEditable()
+ WindowBase get view => _convertNativeToDart_Window(this._get_view);
+ @JSName('view')
+ @DomName('UIEvent.view')
+ @DocsEditable()
+ @Creates('Window|=Object')
+ @Returns('Window|=Object')
+ dynamic get _get_view => wrap_jso(JS("dynamic", "#.view", this.raw));
+
+ @DomName('UIEvent.which')
+ @DocsEditable()
+ @Unstable()
+ int get which => wrap_jso(JS("int", "#.which", this.raw));
+
+ @DomName('UIEvent.initUIEvent')
+ @DocsEditable()
+ void _initUIEvent(String type, bool canBubble, bool cancelable, Window view, int detail) {
+ _initUIEvent_1(type, canBubble, cancelable, view, detail);
+ return;
+ }
+ @JSName('initUIEvent')
+ @DomName('UIEvent.initUIEvent')
+ @DocsEditable()
+ void _initUIEvent_1(type, canBubble, cancelable, Window view, detail) => wrap_jso(JS("void ", "#.raw.initUIEvent(#, #, #, #, #)", this, unwrap_jso(type), unwrap_jso(canBubble), unwrap_jso(cancelable), unwrap_jso(view), unwrap_jso(detail)));
+
+
+ @DomName('UIEvent.layerX')
+ @DomName('UIEvent.layerY')
+ Point get layer => new Point(_layerX, _layerY);
+
+ @DomName('UIEvent.pageX')
+ @DomName('UIEvent.pageY')
+ Point get page => new Point(_pageX, _pageY);
+}
+// 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.
+
+
+@DocsEditable()
+@DomName('URLUtils')
+@Experimental() // untriaged
+abstract class UrlUtils extends DartHtmlDomObject {
+ // To suppress missing implicit constructor warnings.
+ factory UrlUtils._() { throw new UnsupportedError("Not supported"); }
+
+ String get hash => wrap_jso(JS("String", "#.hash", this.raw));
+ void set hash(String val) => JS("void", "#.hash = #", this.raw, unwrap_jso(val));
+
+ String get host => wrap_jso(JS("String", "#.host", this.raw));
+ void set host(String val) => JS("void", "#.host = #", this.raw, unwrap_jso(val));
+
+ String get hostname => wrap_jso(JS("String", "#.hostname", this.raw));
+ void set hostname(String val) => JS("void", "#.hostname = #", this.raw, unwrap_jso(val));
+
+ String get href => wrap_jso(JS("String", "#.href", this.raw));
+ void set href(String val) => JS("void", "#.href = #", this.raw, unwrap_jso(val));
+
+ String get origin => wrap_jso(JS("String", "#.origin", this.raw));
+
+ String get password => wrap_jso(JS("String", "#.password", this.raw));
+ void set password(String val) => JS("void", "#.password = #", this.raw, unwrap_jso(val));
+
+ String get pathname => wrap_jso(JS("String", "#.pathname", this.raw));
+ void set pathname(String val) => JS("void", "#.pathname = #", this.raw, unwrap_jso(val));
+
+ String get port => wrap_jso(JS("String", "#.port", this.raw));
+ void set port(String val) => JS("void", "#.port = #", this.raw, unwrap_jso(val));
+
+ String get protocol => wrap_jso(JS("String", "#.protocol", this.raw));
+ void set protocol(String val) => JS("void", "#.protocol = #", this.raw, unwrap_jso(val));
+
+ String get search => wrap_jso(JS("String", "#.search", this.raw));
+ void set search(String val) => JS("void", "#.search = #", this.raw, unwrap_jso(val));
+
+ String get username => wrap_jso(JS("String", "#.username", this.raw));
+ void set username(String val) => JS("void", "#.username = #", this.raw, unwrap_jso(val));
+
+ String toString() => wrap_jso(JS("String", "#.raw.toString()", this));
+}
+// 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.
+
+
+@DocsEditable()
+/**
+ * Top-level container for the current browser tab or window.
+ *
+ * In a web browser, each window has a [Window] object, but within the context
+ * of a script, this object represents only the current window.
+ * Each other window, tab, and iframe has its own [Window] object.
+ *
+ * Each window contains a [Document] object, which contains all of the window's
+ * content.
+ *
+ * Use the top-level `window` object to access the current window.
+ * For example:
+ *
+ * // Draw a scene when the window repaints.
+ * drawScene(num delta) {...}
+ * window.animationFrame.then(drawScene);.
+ *
+ * // Write to the console.
+ * window.console.log('Jinkies!');
+ * window.console.error('Jeepers!');
+ *
+ * **Note:** This class represents only the current window, while [WindowBase]
+ * is a representation of any window, including other tabs, windows, and frames.
+ *
+ * ## See also
+ *
+ * * [WindowBase]
+ *
+ * ## Other resources
+ *
+ * * [DOM Window](https://developer.mozilla.org/en-US/docs/DOM/window) from MDN.
+ * * [Window](http://www.w3.org/TR/Window/) from the W3C.
+ */
+@DomName('Window')
+@Native("Window")
+class Window extends EventTarget implements WindowBase {
+
+ /**
+ * Returns a Future that completes just before the window is about to
+ * repaint so the user can draw an animation frame.
+ *
+ * If you need to later cancel this animation, use [requestAnimationFrame]
+ * instead.
+ *
+ * The [Future] completes to a timestamp that represents a floating
+ * point value of the number of milliseconds that have elapsed since the page
+ * started to load (which is also the timestamp at this call to
+ * animationFrame).
+ *
+ * Note: The code that runs when the future completes should call
+ * [animationFrame] again for the animation to continue.
+ */
+ Future<num> get animationFrame {
+ var completer = new Completer<num>.sync();
+ requestAnimationFrame((time) {
+ completer.complete(time);
+ });
+ return completer.future;
+ }
+
+ /**
+ * The newest document in this window.
+ *
+ * ## Other resources
+ *
+ * * [Loading web pages]
+ * (http://www.whatwg.org/specs/web-apps/current-work/multipage/browsers.html)
+ * from WHATWG.
+ */
+ Document get document => wrap_jso(JS('Document', '#.document', this.raw));
+
+ WindowBase _open2(url, name) => wrap_jso(JS('Window', '#.open(#,#)', this.raw, url, name));
+
+ WindowBase _open3(url, name, options) =>
+ wrap_jso(JS('Window', '#.open(#,#,#)', this.raw, url, name, options));
+
+ /**
+ * Opens a new window.
+ *
+ * ## Other resources
+ *
+ * * [Window.open]
+ * (https://developer.mozilla.org/en-US/docs/Web/API/Window.open) from MDN.
+ * * [Window open]
+ * (http://docs.webplatform.org/wiki/dom/methods/open) from WebPlatform.org.
+ */
+ WindowBase open(String url, String name, [String options]) {
+ if (options == null) {
+ return _DOMWindowCrossFrame._createSafe(_open2(url, name));
+ } else {
+ return _DOMWindowCrossFrame._createSafe(_open3(url, name, options));
+ }
+ }
+
+ // API level getter and setter for Location.
+ // TODO: The cross domain safe wrapper can be inserted here.
+ /**
+ * The current location of this window.
+ *
+ * Location currentLocation = window.location;
+ * print(currentLocation.href); // 'http://www.example.com:80/'
+ */
+ Location get location => _location;
+
+ // TODO: consider forcing users to do: window.location.assign('string').
+ /**
+ * Sets the window's location, which causes the browser to navigate to the new
+ * location. [value] may be a Location object or a String.
+ */
+ set location(value) {
+ _location = value;
+ }
+
+ // Native getter and setter to access raw Location object.
+ dynamic get _location => wrap_jso(JS('Location|Null', '#.location', this.raw));
+ set _location(value) {
+ JS('void', '#.location = #', this.raw, unwrap_jso(value));
+ }
+
+ /**
+ * Called to draw an animation frame and then request the window to repaint
+ * after [callback] has finished (creating the animation).
+ *
+ * Use this method only if you need to later call [cancelAnimationFrame]. If
+ * not, the preferred Dart idiom is to set animation frames by calling
+ * [animationFrame], which returns a Future.
+ *
+ * Returns a non-zero valued integer to represent the request id for this
+ * request. This value only needs to be saved if you intend to call
+ * [cancelAnimationFrame] so you can specify the particular animation to
+ * cancel.
+ *
+ * Note: The supplied [callback] needs to call [requestAnimationFrame] again
+ * for the animation to continue.
+ */
+ @DomName('Window.requestAnimationFrame')
+ int requestAnimationFrame(RequestAnimationFrameCallback callback) {
+ _ensureRequestAnimationFrame();
+ return _requestAnimationFrame(_wrapZone(callback));
+ }
+
+ /**
+ * Cancels an animation frame request.
+ *
+ * ## Other resources
+ *
+ * * [Window.cancelAnimationFrame]
+ * (https://developer.mozilla.org/en-US/docs/Web/API/Window.cancelAnimationFrame) from MDN.
+ */
+ void cancelAnimationFrame(int id) {
+ _ensureRequestAnimationFrame();
+ _cancelAnimationFrame(id);
+ }
+
+ @JSName('requestAnimationFrame')
+ int _requestAnimationFrame(RequestAnimationFrameCallback callback)
+ => JS('int', '#.requestAnimationFrame', this.raw);
+
+ @JSName('cancelAnimationFrame')
+ void _cancelAnimationFrame(int id)
+ { JS('void', '#.cancelAnimationFrame(#)', this.raw, id); }
+
+ _ensureRequestAnimationFrame() {
+ if (JS('bool',
+ '!!(#.requestAnimationFrame && #.cancelAnimationFrame)', this.raw, this.raw))
+ return;
+
+ JS('void',
+ r"""
+ (function($this) {
+ var vendors = ['ms', 'moz', 'webkit', 'o'];
+ for (var i = 0; i < vendors.length && !$this.requestAnimationFrame; ++i) {
+ $this.requestAnimationFrame = $this[vendors[i] + 'RequestAnimationFrame'];
+ $this.cancelAnimationFrame =
+ $this[vendors[i]+'CancelAnimationFrame'] ||
+ $this[vendors[i]+'CancelRequestAnimationFrame'];
+ }
+ if ($this.requestAnimationFrame && $this.cancelAnimationFrame) return;
+ $this.requestAnimationFrame = function(callback) {
+ return window.setTimeout(function() {
+ callback(Date.now());
+ }, 16 /* 16ms ~= 60fps */);
+ };
+ $this.cancelAnimationFrame = function(id) { clearTimeout(id); }
+ })(#)""",
+ this.raw);
+ }
+
+ /// The debugging console for this window.
+ @DomName('Window.console')
+ Console get console => Console._safeConsole;
+
+ // To suppress missing implicit constructor warnings.
+ factory Window._() { throw new UnsupportedError("Not supported"); }
+
+ /**
+ * Static factory designed to expose `contentloaded` events to event
+ * handlers that are not necessarily instances of [Window].
+ *
+ * See [EventStreamProvider] for usage information.
+ */
+ @DomName('Window.DOMContentLoadedEvent')
+ @DocsEditable()
+ static const EventStreamProvider<Event> contentLoadedEvent = const EventStreamProvider<Event>('DOMContentLoaded');
+
+
+ @Deprecated("Internal Use Only")
+ static Window internalCreateWindow() {
+ return new Window.internal_();
+ }
+
+ @Deprecated("Internal Use Only")
+ Window.internal_() : super.internal_();
+
+
+ /**
+ * Indicates that file system data cannot be cleared unless given user
+ * permission.
+ *
+ * ## Other resources
+ *
+ * * [Exploring the FileSystem APIs]
+ * (http://www.html5rocks.com/en/tutorials/file/filesystem/) from HTML5Rocks.
+ * * [File API]
+ * (http://www.w3.org/TR/file-system-api/#idl-def-LocalFileSystem) from W3C.
+ */
+ @DomName('Window.PERSISTENT')
+ @DocsEditable()
+ // http://www.w3.org/TR/file-system-api/#idl-def-LocalFileSystem
+ @Experimental()
+ static const int PERSISTENT = 1;
+
+ /**
+ * Indicates that file system data can be cleared at any time.
+ *
+ * ## Other resources
+ *
+ * * [Exploring the FileSystem APIs]
+ * (http://www.html5rocks.com/en/tutorials/file/filesystem/) from HTML5Rocks.
+ * * [File API]
+ * (http://www.w3.org/TR/file-system-api/#idl-def-LocalFileSystem) from W3C.
+ */
+ @DomName('Window.TEMPORARY')
+ @DocsEditable()
+ // http://www.w3.org/TR/file-system-api/#idl-def-LocalFileSystem
+ @Experimental()
+ static const int TEMPORARY = 0;
+
+ @DomName('Window.closed')
+ @DocsEditable()
+ bool get closed => wrap_jso(JS("bool", "#.closed", this.raw));
+
+ /// *Deprecated*.
+ @DomName('Window.defaultStatus')
+ @DocsEditable()
+ @Experimental() // non-standard
+ String get defaultStatus => wrap_jso(JS("String", "#.defaultStatus", this.raw));
+ /// *Deprecated*.
+ @DomName('Window.defaultStatus')
+ @DocsEditable()
+ @Experimental() // non-standard
+ void set defaultStatus(String val) => JS("void", "#.defaultStatus = #", this.raw, unwrap_jso(val));
+
+ /// *Deprecated*.
+ @DomName('Window.defaultstatus')
+ @DocsEditable()
+ @Experimental() // non-standard
+ String get defaultstatus => wrap_jso(JS("String", "#.defaultstatus", this.raw));
+ /// *Deprecated*.
+ @DomName('Window.defaultstatus')
+ @DocsEditable()
+ @Experimental() // non-standard
+ void set defaultstatus(String val) => JS("void", "#.defaultstatus = #", this.raw, unwrap_jso(val));
+
+ /**
+ * The ratio between physical pixels and logical CSS pixels.
+ *
+ * ## Other resources
+ *
+ * * [devicePixelRatio]
+ * (http://www.quirksmode.org/blog/archives/2012/06/devicepixelrati.html) from
+ * quirksmode.
+ * * [More about devicePixelRatio]
+ * (http://www.quirksmode.org/blog/archives/2012/07/more_about_devi.html) from
+ * quirksmode.
+ */
+ @DomName('Window.devicePixelRatio')
+ @DocsEditable()
+ // http://www.quirksmode.org/blog/archives/2012/06/devicepixelrati.html
+ @Experimental() // non-standard
+ double get devicePixelRatio => wrap_jso(JS("double", "#.devicePixelRatio", this.raw));
+
+ /**
+ * The current session history for this window's newest document.
+ *
+ * ## Other resources
+ *
+ * * [Loading web pages]
+ * (http://www.whatwg.org/specs/web-apps/current-work/multipage/browsers.html)
+ * from WHATWG.
+ */
+ @DomName('Window.history')
+ @DocsEditable()
+ History get history => wrap_jso(JS("History", "#.history", this.raw));
+
+ /**
+ * The height of the viewport including scrollbars.
+ *
+ * ## Other resources
+ *
+ * * [innerHeight]
+ * (http://docs.webplatform.org/wiki/css/cssom/properties/innerHeight) from
+ * WebPlatform.org.
+ */
+ @DomName('Window.innerHeight')
+ @DocsEditable()
+ int get innerHeight => wrap_jso(JS("int", "#.innerHeight", this.raw));
+
+ /**
+ * The width of the viewport including scrollbars.
+ *
+ * ## Other resources
+ *
+ * * [innerWidth]
+ * (http://docs.webplatform.org/wiki/css/cssom/properties/innerWidth) from
+ * WebPlatform.org.
+ */
+ @DomName('Window.innerWidth')
+ @DocsEditable()
+ int get innerWidth => wrap_jso(JS("int", "#.innerWidth", this.raw));
+
+ /**
+ * The name of this window.
+ *
+ * ## Other resources
+ *
+ * * [Window name]
+ * (http://docs.webplatform.org/wiki/html/attributes/name_(window)) from
+ * WebPlatform.org.
+ */
+ @DomName('Window.name')
+ @DocsEditable()
+ String get name => wrap_jso(JS("String", "#.name", this.raw));
+ /**
+ * The name of this window.
+ *
+ * ## Other resources
+ *
+ * * [Window name]
+ * (http://docs.webplatform.org/wiki/html/attributes/name_(window)) from
+ * WebPlatform.org.
+ */
+ @DomName('Window.name')
+ @DocsEditable()
+ void set name(String val) => JS("void", "#.name = #", this.raw, unwrap_jso(val));
+
+ /**
+ * The user agent accessing this window.
+ *
+ * ## Other resources
+ *
+ * * [The navigator object]
+ * (http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#the-navigator-object)
+ * from WHATWG.
+ */
+ @DomName('Window.navigator')
+ @DocsEditable()
+ Navigator get navigator => wrap_jso(JS("Navigator", "#.navigator", this.raw));
+
+ /**
+ * Whether objects are drawn offscreen before being displayed.
+ *
+ * ## Other resources
+ *
+ * * [offscreenBuffering]
+ * (http://docs.webplatform.org/wiki/dom/properties/offscreenBuffering) from
+ * WebPlatform.org.
+ */
+ @DomName('Window.offscreenBuffering')
+ @DocsEditable()
+ @Experimental() // non-standard
+ bool get offscreenBuffering => wrap_jso(JS("bool", "#.offscreenBuffering", this.raw));
+
+ @DomName('Window.opener')
+ @DocsEditable()
+ WindowBase get opener => _convertNativeToDart_Window(this._get_opener);
+ @JSName('opener')
+ @DomName('Window.opener')
+ @DocsEditable()
+ @Creates('Window|=Object')
+ @Returns('Window|=Object')
+ dynamic get _get_opener => wrap_jso(JS("dynamic", "#.opener", this.raw));
+
+ set opener(Window value) {
+ JS("void", "#.raw.opener = #", this, unwrap_jso(value));
+ }
+
+ @DomName('Window.orientation')
+ @DocsEditable()
+ @Experimental() // untriaged
+ int get orientation => wrap_jso(JS("int", "#.orientation", this.raw));
+
+ /**
+ * The height of this window including all user interface elements.
+ *
+ * ## Other resources
+ *
+ * * [outerHeight]
+ * (http://docs.webplatform.org/wiki/css/cssom/properties/outerHeight) from
+ * WebPlatform.org.
+ */
+ @DomName('Window.outerHeight')
+ @DocsEditable()
+ int get outerHeight => wrap_jso(JS("int", "#.outerHeight", this.raw));
+
+ /**
+ * The width of the window including all user interface elements.
+ *
+ * ## Other resources
+ *
+ * * [outerWidth]
+ * (http://docs.webplatform.org/wiki/css/cssom/properties/outerWidth) from
+ * WebPlatform.org.
+ */
+ @DomName('Window.outerWidth')
+ @DocsEditable()
+ int get outerWidth => wrap_jso(JS("int", "#.outerWidth", this.raw));
+
+ @JSName('pageXOffset')
+ /**
+ * The distance this window has been scrolled horizontally.
+ *
+ * This attribute is an alias for [scrollX].
+ *
+ * ## Other resources
+ *
+ * * [The Screen interface specification]
+ * (http://www.w3.org/TR/cssom-view/#screen) from W3C.
+ * * [scrollX and pageXOffset]
+ * (https://developer.mozilla.org/en-US/docs/Web/API/Window.scrollX) from MDN.
+ */
+ @DomName('Window.pageXOffset')
+ @DocsEditable()
+ double get _pageXOffset => wrap_jso(JS("double", "#.pageXOffset", this.raw));
+
+ @JSName('pageYOffset')
+ /**
+ * The distance this window has been scrolled vertically.
+ *
+ * This attribute is an alias for [scrollY].
+ *
+ * ## Other resources
+ *
+ * * [The Screen interface specification]
+ * (http://www.w3.org/TR/cssom-view/#screen) from W3C.
+ * * [scrollY and pageYOffset]
+ * (https://developer.mozilla.org/en-US/docs/Web/API/Window.scrollY) from MDN.
+ */
+ @DomName('Window.pageYOffset')
+ @DocsEditable()
+ double get _pageYOffset => wrap_jso(JS("double", "#.pageYOffset", this.raw));
+
+ @DomName('Window.parent')
+ @DocsEditable()
+ WindowBase get parent => _convertNativeToDart_Window(this._get_parent);
+ @JSName('parent')
+ @DomName('Window.parent')
+ @DocsEditable()
+ @Creates('Window|=Object')
+ @Returns('Window|=Object')
+ dynamic get _get_parent => wrap_jso(JS("dynamic", "#.parent", this.raw));
+
+ /**
+ * The distance from the left side of the screen to the left side of this
+ * window.
+ *
+ * ## Other resources
+ *
+ * * [The Screen interface specification]
+ * (http://www.w3.org/TR/cssom-view/#screen) from W3C.
+ */
+ @DomName('Window.screenLeft')
+ @DocsEditable()
+ int get screenLeft => wrap_jso(JS("int", "#.screenLeft", this.raw));
+
+ /**
+ * The distance from the top of the screen to the top of this window.
+ *
+ * ## Other resources
+ *
+ * * [The Screen interface specification]
+ * (http://www.w3.org/TR/cssom-view/#screen) from W3C.
+ */
+ @DomName('Window.screenTop')
+ @DocsEditable()
+ int get screenTop => wrap_jso(JS("int", "#.screenTop", this.raw));
+
+ /**
+ * The distance from the left side of the screen to the mouse pointer.
+ *
+ * ## Other resources
+ *
+ * * [The Screen interface specification]
+ * (http://www.w3.org/TR/cssom-view/#screen) from W3C.
+ */
+ @DomName('Window.screenX')
+ @DocsEditable()
+ int get screenX => wrap_jso(JS("int", "#.screenX", this.raw));
+
+ /**
+ * The distance from the top of the screen to the mouse pointer.
+ *
+ * ## Other resources
+ *
+ * * [The Screen interface specification]
+ * (http://www.w3.org/TR/cssom-view/#screen) from W3C.
+ */
+ @DomName('Window.screenY')
+ @DocsEditable()
+ int get screenY => wrap_jso(JS("int", "#.screenY", this.raw));
+
+ /**
+ * The current window.
+ *
+ * ## Other resources
+ *
+ * * [Window.self]
+ * (https://developer.mozilla.org/en-US/docs/Web/API/Window.self) from MDN.
+ */
+ @DomName('Window.self')
+ @DocsEditable()
+ WindowBase get self => _convertNativeToDart_Window(this._get_self);
+ @JSName('self')
+ /**
+ * The current window.
+ *
+ * ## Other resources
+ *
+ * * [Window.self]
+ * (https://developer.mozilla.org/en-US/docs/Web/API/Window.self) from MDN.
+ */
+ @DomName('Window.self')
+ @DocsEditable()
+ @Creates('Window|=Object')
+ @Returns('Window|=Object')
+ dynamic get _get_self => wrap_jso(JS("dynamic", "#.self", this.raw));
+
+ /// *Deprecated*.
+ @DomName('Window.status')
+ @DocsEditable()
+ String get status => wrap_jso(JS("String", "#.status", this.raw));
+ /// *Deprecated*.
+ @DomName('Window.status')
+ @DocsEditable()
+ void set status(String val) => JS("void", "#.status = #", this.raw, unwrap_jso(val));
+
+ @DomName('Window.top')
+ @DocsEditable()
+ WindowBase get top => _convertNativeToDart_Window(this._get_top);
+ @JSName('top')
+ @DomName('Window.top')
+ @DocsEditable()
+ @Creates('Window|=Object')
+ @Returns('Window|=Object')
+ dynamic get _get_top => wrap_jso(JS("dynamic", "#.top", this.raw));
+
+ /**
+ * The current window.
+ *
+ * ## Other resources
+ *
+ * * [Window.window]
+ * (https://developer.mozilla.org/en-US/docs/Web/API/Window.window) from MDN.
+ */
+ @DomName('Window.window')
+ @DocsEditable()
+ WindowBase get window => _convertNativeToDart_Window(this._get_window);
+ @JSName('window')
+ /**
+ * The current window.
+ *
+ * ## Other resources
+ *
+ * * [Window.window]
+ * (https://developer.mozilla.org/en-US/docs/Web/API/Window.window) from MDN.
+ */
+ @DomName('Window.window')
+ @DocsEditable()
+ @Creates('Window|=Object')
+ @Returns('Window|=Object')
+ dynamic get _get_window => wrap_jso(JS("dynamic", "#.window", this.raw));
+
+ @DomName('Window.__getter__')
+ @DocsEditable()
+ @Creates('Window|=Object')
+ @Returns('Window|=Object')
+ WindowBase __getter__(index_OR_name) {
+ if ((index_OR_name is int)) {
+ return _convertNativeToDart_Window(__getter___1(index_OR_name));
+ }
+ if ((index_OR_name is String)) {
+ return _convertNativeToDart_Window(__getter___2(index_OR_name));
+ }
+ throw new ArgumentError("Incorrect number or type of arguments");
+ }
+ @JSName('__getter__')
+ @DomName('Window.__getter__')
+ @DocsEditable()
+ @Creates('Window|=Object')
+ @Returns('Window|=Object')
+ __getter___1(int index) => wrap_jso(JS("", "#.raw.__getter__(#)", this, unwrap_jso(index)));
+ @JSName('__getter__')
+ @DomName('Window.__getter__')
+ @DocsEditable()
+ @Creates('Window|=Object')
+ @Returns('Window|=Object')
+ __getter___2(String name) => wrap_jso(JS("", "#.raw.__getter__(#)", this, unwrap_jso(name)));
+
+ /**
+ * Displays a modal alert to the user.
+ *
+ * ## Other resources
+ *
+ * * [User prompts]
+ * (http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#user-prompts)
+ * from WHATWG.
+ */
+ @DomName('Window.alert')
+ @DocsEditable()
+ void alert([String message]) {
+ if (message != null) {
+ _alert_1(message);
+ return;
+ }
+ _alert_2();
+ return;
+ }
+ @JSName('alert')
+ /**
+ * Displays a modal alert to the user.
+ *
+ * ## Other resources
+ *
+ * * [User prompts]
+ * (http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#user-prompts)
+ * from WHATWG.
+ */
+ @DomName('Window.alert')
+ @DocsEditable()
+ void _alert_1(message) => wrap_jso(JS("void ", "#.raw.alert(#)", this, unwrap_jso(message)));
+ @JSName('alert')
+ /**
+ * Displays a modal alert to the user.
+ *
+ * ## Other resources
+ *
+ * * [User prompts]
+ * (http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#user-prompts)
+ * from WHATWG.
+ */
+ @DomName('Window.alert')
+ @DocsEditable()
+ void _alert_2() => wrap_jso(JS("void ", "#.raw.alert()", this));
+
+ @DomName('Window.close')
+ @DocsEditable()
+ void close() {
+ _close_1();
+ return;
+ }
+ @JSName('close')
+ @DomName('Window.close')
+ @DocsEditable()
+ void _close_1() => wrap_jso(JS("void ", "#.raw.close()", this));
+
+ /**
+ * Displays a modal OK/Cancel prompt to the user.
+ *
+ * ## Other resources
+ *
+ * * [User prompts]
+ * (http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#user-prompts)
+ * from WHATWG.
+ */
+ @DomName('Window.confirm')
+ @DocsEditable()
+ bool confirm([String message]) {
+ if (message != null) {
+ return _confirm_1(message);
+ }
+ return _confirm_2();
+ }
+ @JSName('confirm')
+ /**
+ * Displays a modal OK/Cancel prompt to the user.
+ *
+ * ## Other resources
+ *
+ * * [User prompts]
+ * (http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#user-prompts)
+ * from WHATWG.
+ */
+ @DomName('Window.confirm')
+ @DocsEditable()
+ bool _confirm_1(message) => wrap_jso(JS("bool ", "#.raw.confirm(#)", this, unwrap_jso(message)));
+ @JSName('confirm')
+ /**
+ * Displays a modal OK/Cancel prompt to the user.
+ *
+ * ## Other resources
+ *
+ * * [User prompts]
+ * (http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#user-prompts)
+ * from WHATWG.
+ */
+ @DomName('Window.confirm')
+ @DocsEditable()
+ bool _confirm_2() => wrap_jso(JS("bool ", "#.raw.confirm()", this));
+
+ /**
+ * Finds text in this window.
+ *
+ * ## Other resources
+ *
+ * * [Window.find]
+ * (https://developer.mozilla.org/en-US/docs/Web/API/Window.find) from MDN.
+ */
+ @DomName('Window.find')
+ @DocsEditable()
+ @Experimental() // non-standard
+ bool find(String string, bool caseSensitive, bool backwards, bool wrap, bool wholeWord, bool searchInFrames, bool showDialog) {
+ return _find_1(string, caseSensitive, backwards, wrap, wholeWord, searchInFrames, showDialog);
+ }
+ @JSName('find')
+ /**
+ * Finds text in this window.
+ *
+ * ## Other resources
+ *
+ * * [Window.find]
+ * (https://developer.mozilla.org/en-US/docs/Web/API/Window.find) from MDN.
+ */
+ @DomName('Window.find')
+ @DocsEditable()
+ @Experimental() // non-standard
+ bool _find_1(string, caseSensitive, backwards, wrap, wholeWord, searchInFrames, showDialog) => wrap_jso(JS("bool ", "#.raw.find(#, #, #, #, #, #, #)", this, unwrap_jso(string), unwrap_jso(caseSensitive), unwrap_jso(backwards), unwrap_jso(wrap), unwrap_jso(wholeWord), unwrap_jso(searchInFrames), unwrap_jso(showDialog)));
+
+ @DomName('Window.getComputedStyle')
+ @DocsEditable()
+ CssStyleDeclaration _getComputedStyle(Element element, String pseudoElement) {
+ return _getComputedStyle_1(element, pseudoElement);
+ }
+ @JSName('getComputedStyle')
+ @DomName('Window.getComputedStyle')
+ @DocsEditable()
+ CssStyleDeclaration _getComputedStyle_1(Element element, pseudoElement) => wrap_jso(JS("CssStyleDeclaration ", "#.raw.getComputedStyle(#, #)", this, unwrap_jso(element), unwrap_jso(pseudoElement)));
+
+ /**
+ * Moves this window.
+ *
+ * x and y can be negative.
+ *
+ * ## Other resources
+ *
+ * * [Window.moveBy]
+ * (https://developer.mozilla.org/en-US/docs/Web/API/Window.moveBy) from MDN.
+ * * [Window.moveBy]
+ * (http://dev.w3.org/csswg/cssom-view/#dom-window-moveby) from W3C.
+ */
+ @DomName('Window.moveBy')
+ @DocsEditable()
+ void moveBy(num x, num y) {
+ _moveBy_1(x, y);
+ return;
+ }
+ @JSName('moveBy')
+ /**
+ * Moves this window.
+ *
+ * x and y can be negative.
+ *
+ * ## Other resources
+ *
+ * * [Window.moveBy]
+ * (https://developer.mozilla.org/en-US/docs/Web/API/Window.moveBy) from MDN.
+ * * [Window.moveBy]
+ * (http://dev.w3.org/csswg/cssom-view/#dom-window-moveby) from W3C.
+ */
+ @DomName('Window.moveBy')
+ @DocsEditable()
+ void _moveBy_1(x, y) => wrap_jso(JS("void ", "#.raw.moveBy(#, #)", this, unwrap_jso(x), unwrap_jso(y)));
+
+ @DomName('Window.moveTo')
+ @DocsEditable()
+ void _moveTo(num x, num y) {
+ _moveTo_1(x, y);
+ return;
+ }
+ @JSName('moveTo')
+ @DomName('Window.moveTo')
+ @DocsEditable()
+ void _moveTo_1(x, y) => wrap_jso(JS("void ", "#.raw.moveTo(#, #)", this, unwrap_jso(x), unwrap_jso(y)));
+
+ /**
+ * Opens the print dialog for this window.
+ *
+ * ## Other resources
+ *
+ * * [Window.print]
+ * (https://developer.mozilla.org/en-US/docs/Web/API/Window.print) from MDN.
+ */
+ @DomName('Window.print')
+ @DocsEditable()
+ void print() {
+ _print_1();
+ return;
+ }
+ @JSName('print')
+ /**
+ * Opens the print dialog for this window.
+ *
+ * ## Other resources
+ *
+ * * [Window.print]
+ * (https://developer.mozilla.org/en-US/docs/Web/API/Window.print) from MDN.
+ */
+ @DomName('Window.print')
+ @DocsEditable()
+ void _print_1() => wrap_jso(JS("void ", "#.raw.print()", this));
+
+ /**
+ * Resizes this window by an offset.
+ *
+ * ## Other resources
+ *
+ * * [Window resizeBy] (http://docs.webplatform.org/wiki/dom/methods/resizeBy)
+ * from WebPlatform.org.
+ */
+ @DomName('Window.resizeBy')
+ @DocsEditable()
+ void resizeBy(num x, num y) {
+ _resizeBy_1(x, y);
+ return;
+ }
+ @JSName('resizeBy')
+ /**
+ * Resizes this window by an offset.
+ *
+ * ## Other resources
+ *
+ * * [Window resizeBy] (http://docs.webplatform.org/wiki/dom/methods/resizeBy)
+ * from WebPlatform.org.
+ */
+ @DomName('Window.resizeBy')
+ @DocsEditable()
+ void _resizeBy_1(x, y) => wrap_jso(JS("void ", "#.raw.resizeBy(#, #)", this, unwrap_jso(x), unwrap_jso(y)));
+
+ /**
+ * Resizes this window to a specific width and height.
+ *
+ * ## Other resources
+ *
+ * * [Window resizeTo] (http://docs.webplatform.org/wiki/dom/methods/resizeTo)
+ * from WebPlatform.org.
+ */
+ @DomName('Window.resizeTo')
+ @DocsEditable()
+ void resizeTo(num width, num height) {
+ _resizeTo_1(width, height);
+ return;
+ }
+ @JSName('resizeTo')
+ /**
+ * Resizes this window to a specific width and height.
+ *
+ * ## Other resources
+ *
+ * * [Window resizeTo] (http://docs.webplatform.org/wiki/dom/methods/resizeTo)
+ * from WebPlatform.org.
+ */
+ @DomName('Window.resizeTo')
+ @DocsEditable()
+ void _resizeTo_1(width, height) => wrap_jso(JS("void ", "#.raw.resizeTo(#, #)", this, unwrap_jso(width), unwrap_jso(height)));
+
+ /**
+ * Scrolls the page horizontally and vertically to a specific point.
+ *
+ * This method is identical to [scrollTo].
+ *
+ * ## Other resources
+ *
+ * * [Window scroll] (http://docs.webplatform.org/wiki/dom/methods/scroll)
+ * from WebPlatform.org.
+ */
+ @DomName('Window.scroll')
+ @DocsEditable()
+ void scroll(x, y, [Map scrollOptions]) {
+ if ((y is num) && (x is num) && scrollOptions == null) {
+ _scroll_1(x, y);
+ return;
+ }
+ if (scrollOptions != null && (y is num) && (x is num)) {
+ var scrollOptions_1 = convertDartToNative_Dictionary(scrollOptions);
+ _scroll_2(x, y, scrollOptions_1);
+ return;
+ }
+ if ((y is int) && (x is int) && scrollOptions == null) {
+ _scroll_3(x, y);
+ return;
+ }
+ if (scrollOptions != null && (y is int) && (x is int)) {
+ var scrollOptions_1 = convertDartToNative_Dictionary(scrollOptions);
+ _scroll_4(x, y, scrollOptions_1);
+ return;
+ }
+ throw new ArgumentError("Incorrect number or type of arguments");
+ }
+ @JSName('scroll')
+ /**
+ * Scrolls the page horizontally and vertically to a specific point.
+ *
+ * This method is identical to [scrollTo].
+ *
+ * ## Other resources
+ *
+ * * [Window scroll] (http://docs.webplatform.org/wiki/dom/methods/scroll)
+ * from WebPlatform.org.
+ */
+ @DomName('Window.scroll')
+ @DocsEditable()
+ void _scroll_1(num x, num y) => wrap_jso(JS("void ", "#.raw.scroll(#, #)", this, unwrap_jso(x), unwrap_jso(y)));
+ @JSName('scroll')
+ /**
+ * Scrolls the page horizontally and vertically to a specific point.
+ *
+ * This method is identical to [scrollTo].
+ *
+ * ## Other resources
+ *
+ * * [Window scroll] (http://docs.webplatform.org/wiki/dom/methods/scroll)
+ * from WebPlatform.org.
+ */
+ @DomName('Window.scroll')
+ @DocsEditable()
+ void _scroll_2(num x, num y, scrollOptions) => wrap_jso(JS("void ", "#.raw.scroll(#, #, #)", this, unwrap_jso(x), unwrap_jso(y), unwrap_jso(scrollOptions)));
+ @JSName('scroll')
+ /**
+ * Scrolls the page horizontally and vertically to a specific point.
+ *
+ * This method is identical to [scrollTo].
+ *
+ * ## Other resources
+ *
+ * * [Window scroll] (http://docs.webplatform.org/wiki/dom/methods/scroll)
+ * from WebPlatform.org.
+ */
+ @DomName('Window.scroll')
+ @DocsEditable()
+ void _scroll_3(int x, int y) => wrap_jso(JS("void ", "#.raw.scroll(#, #)", this, unwrap_jso(x), unwrap_jso(y)));
+ @JSName('scroll')
+ /**
+ * Scrolls the page horizontally and vertically to a specific point.
+ *
+ * This method is identical to [scrollTo].
+ *
+ * ## Other resources
+ *
+ * * [Window scroll] (http://docs.webplatform.org/wiki/dom/methods/scroll)
+ * from WebPlatform.org.
+ */
+ @DomName('Window.scroll')
+ @DocsEditable()
+ void _scroll_4(int x, int y, scrollOptions) => wrap_jso(JS("void ", "#.raw.scroll(#, #, #)", this, unwrap_jso(x), unwrap_jso(y), unwrap_jso(scrollOptions)));
+
+ /**
+ * Scrolls the page horizontally and vertically by an offset.
+ *
+ * ## Other resources
+ *
+ * * [Window scrollBy] (http://docs.webplatform.org/wiki/dom/methods/scrollBy)
+ * from WebPlatform.org.
+ */
+ @DomName('Window.scrollBy')
+ @DocsEditable()
+ void scrollBy(x, y, [Map scrollOptions]) {
+ if ((y is num) && (x is num) && scrollOptions == null) {
+ _scrollBy_1(x, y);
+ return;
+ }
+ if (scrollOptions != null && (y is num) && (x is num)) {
+ var scrollOptions_1 = convertDartToNative_Dictionary(scrollOptions);
+ _scrollBy_2(x, y, scrollOptions_1);
+ return;
+ }
+ if ((y is int) && (x is int) && scrollOptions == null) {
+ _scrollBy_3(x, y);
+ return;
+ }
+ if (scrollOptions != null && (y is int) && (x is int)) {
+ var scrollOptions_1 = convertDartToNative_Dictionary(scrollOptions);
+ _scrollBy_4(x, y, scrollOptions_1);
+ return;
+ }
+ throw new ArgumentError("Incorrect number or type of arguments");
+ }
+ @JSName('scrollBy')
+ /**
+ * Scrolls the page horizontally and vertically by an offset.
+ *
+ * ## Other resources
+ *
+ * * [Window scrollBy] (http://docs.webplatform.org/wiki/dom/methods/scrollBy)
+ * from WebPlatform.org.
+ */
+ @DomName('Window.scrollBy')
+ @DocsEditable()
+ void _scrollBy_1(num x, num y) => wrap_jso(JS("void ", "#.raw.scrollBy(#, #)", this, unwrap_jso(x), unwrap_jso(y)));
+ @JSName('scrollBy')
+ /**
+ * Scrolls the page horizontally and vertically by an offset.
+ *
+ * ## Other resources
+ *
+ * * [Window scrollBy] (http://docs.webplatform.org/wiki/dom/methods/scrollBy)
+ * from WebPlatform.org.
+ */
+ @DomName('Window.scrollBy')
+ @DocsEditable()
+ void _scrollBy_2(num x, num y, scrollOptions) => wrap_jso(JS("void ", "#.raw.scrollBy(#, #, #)", this, unwrap_jso(x), unwrap_jso(y), unwrap_jso(scrollOptions)));
+ @JSName('scrollBy')
+ /**
+ * Scrolls the page horizontally and vertically by an offset.
+ *
+ * ## Other resources
+ *
+ * * [Window scrollBy] (http://docs.webplatform.org/wiki/dom/methods/scrollBy)
+ * from WebPlatform.org.
+ */
+ @DomName('Window.scrollBy')
+ @DocsEditable()
+ void _scrollBy_3(int x, int y) => wrap_jso(JS("void ", "#.raw.scrollBy(#, #)", this, unwrap_jso(x), unwrap_jso(y)));
+ @JSName('scrollBy')
+ /**
+ * Scrolls the page horizontally and vertically by an offset.
+ *
+ * ## Other resources
+ *
+ * * [Window scrollBy] (http://docs.webplatform.org/wiki/dom/methods/scrollBy)
+ * from WebPlatform.org.
+ */
+ @DomName('Window.scrollBy')
+ @DocsEditable()
+ void _scrollBy_4(int x, int y, scrollOptions) => wrap_jso(JS("void ", "#.raw.scrollBy(#, #, #)", this, unwrap_jso(x), unwrap_jso(y), unwrap_jso(scrollOptions)));
+
+ /**
+ * Scrolls the page horizontally and vertically to a specific point.
+ *
+ * This method is identical to [scroll].
+ *
+ * ## Other resources
+ *
+ * * [Window scrollTo] (http://docs.webplatform.org/wiki/dom/methods/scrollTo)
+ * from WebPlatform.org.
+ */
+ @DomName('Window.scrollTo')
+ @DocsEditable()
+ void scrollTo(x, y, [Map scrollOptions]) {
+ if ((y is num) && (x is num) && scrollOptions == null) {
+ _scrollTo_1(x, y);
+ return;
+ }
+ if (scrollOptions != null && (y is num) && (x is num)) {
+ var scrollOptions_1 = convertDartToNative_Dictionary(scrollOptions);
+ _scrollTo_2(x, y, scrollOptions_1);
+ return;
+ }
+ if ((y is int) && (x is int) && scrollOptions == null) {
+ _scrollTo_3(x, y);
+ return;
+ }
+ if (scrollOptions != null && (y is int) && (x is int)) {
+ var scrollOptions_1 = convertDartToNative_Dictionary(scrollOptions);
+ _scrollTo_4(x, y, scrollOptions_1);
+ return;
+ }
+ throw new ArgumentError("Incorrect number or type of arguments");
+ }
+ @JSName('scrollTo')
+ /**
+ * Scrolls the page horizontally and vertically to a specific point.
+ *
+ * This method is identical to [scroll].
+ *
+ * ## Other resources
+ *
+ * * [Window scrollTo] (http://docs.webplatform.org/wiki/dom/methods/scrollTo)
+ * from WebPlatform.org.
+ */
+ @DomName('Window.scrollTo')
+ @DocsEditable()
+ void _scrollTo_1(num x, num y) => wrap_jso(JS("void ", "#.raw.scrollTo(#, #)", this, unwrap_jso(x), unwrap_jso(y)));
+ @JSName('scrollTo')
+ /**
+ * Scrolls the page horizontally and vertically to a specific point.
+ *
+ * This method is identical to [scroll].
+ *
+ * ## Other resources
+ *
+ * * [Window scrollTo] (http://docs.webplatform.org/wiki/dom/methods/scrollTo)
+ * from WebPlatform.org.
+ */
+ @DomName('Window.scrollTo')
+ @DocsEditable()
+ void _scrollTo_2(num x, num y, scrollOptions) => wrap_jso(JS("void ", "#.raw.scrollTo(#, #, #)", this, unwrap_jso(x), unwrap_jso(y), unwrap_jso(scrollOptions)));
+ @JSName('scrollTo')
+ /**
+ * Scrolls the page horizontally and vertically to a specific point.
+ *
+ * This method is identical to [scroll].
+ *
+ * ## Other resources
+ *
+ * * [Window scrollTo] (http://docs.webplatform.org/wiki/dom/methods/scrollTo)
+ * from WebPlatform.org.
+ */
+ @DomName('Window.scrollTo')
+ @DocsEditable()
+ void _scrollTo_3(int x, int y) => wrap_jso(JS("void ", "#.raw.scrollTo(#, #)", this, unwrap_jso(x), unwrap_jso(y)));
+ @JSName('scrollTo')
+ /**
+ * Scrolls the page horizontally and vertically to a specific point.
+ *
+ * This method is identical to [scroll].
+ *
+ * ## Other resources
+ *
+ * * [Window scrollTo] (http://docs.webplatform.org/wiki/dom/methods/scrollTo)
+ * from WebPlatform.org.
+ */
+ @DomName('Window.scrollTo')
+ @DocsEditable()
+ void _scrollTo_4(int x, int y, scrollOptions) => wrap_jso(JS("void ", "#.raw.scrollTo(#, #, #)", this, unwrap_jso(x), unwrap_jso(y), unwrap_jso(scrollOptions)));
+
+ /**
+ * Opens a new page as a modal dialog.
+ *
+ * ## Other resources
+ *
+ * * [Dialogs implemented using separate documents]
+ * (http://www.w3.org/html/wg/drafts/html/master/webappapis.html#dialogs-implemented-using-separate-documents)
+ * from W3C.
+ */
+ @DomName('Window.showModalDialog')
+ @DocsEditable()
+ @Creates('Null')
+ Object showModalDialog(String url, [Object dialogArgs, String featureArgs]) {
+ if (featureArgs != null) {
+ return _showModalDialog_1(url, dialogArgs, featureArgs);
+ }
+ if (dialogArgs != null) {
+ return _showModalDialog_2(url, dialogArgs);
+ }
+ return _showModalDialog_3(url);
+ }
+ @JSName('showModalDialog')
+ /**
+ * Opens a new page as a modal dialog.
+ *
+ * ## Other resources
+ *
+ * * [Dialogs implemented using separate documents]
+ * (http://www.w3.org/html/wg/drafts/html/master/webappapis.html#dialogs-implemented-using-separate-documents)
+ * from W3C.
+ */
+ @DomName('Window.showModalDialog')
+ @DocsEditable()
+ @Creates('Null')
+ Object _showModalDialog_1(url, dialogArgs, featureArgs) => wrap_jso(JS("Object ", "#.raw.showModalDialog(#, #, #)", this, unwrap_jso(url), unwrap_jso(dialogArgs), unwrap_jso(featureArgs)));
+ @JSName('showModalDialog')
+ /**
+ * Opens a new page as a modal dialog.
+ *
+ * ## Other resources
+ *
+ * * [Dialogs implemented using separate documents]
+ * (http://www.w3.org/html/wg/drafts/html/master/webappapis.html#dialogs-implemented-using-separate-documents)
+ * from W3C.
+ */
+ @DomName('Window.showModalDialog')
+ @DocsEditable()
+ @Creates('Null')
+ Object _showModalDialog_2(url, dialogArgs) => wrap_jso(JS("Object ", "#.raw.showModalDialog(#, #)", this, unwrap_jso(url), unwrap_jso(dialogArgs)));
+ @JSName('showModalDialog')
+ /**
+ * Opens a new page as a modal dialog.
+ *
+ * ## Other resources
+ *
+ * * [Dialogs implemented using separate documents]
+ * (http://www.w3.org/html/wg/drafts/html/master/webappapis.html#dialogs-implemented-using-separate-documents)
+ * from W3C.
+ */
+ @DomName('Window.showModalDialog')
+ @DocsEditable()
+ @Creates('Null')
+ Object _showModalDialog_3(url) => wrap_jso(JS("Object ", "#.raw.showModalDialog(#)", this, unwrap_jso(url)));
+
+ /**
+ * Stops the window from loading.
+ *
+ * ## Other resources
+ *
+ * * [The Window object]
+ * (http://www.w3.org/html/wg/drafts/html/master/browsers.html#the-window-object)
+ * from W3C.
+ */
+ @DomName('Window.stop')
+ @DocsEditable()
+ void stop() {
+ _stop_1();
+ return;
+ }
+ @JSName('stop')
+ /**
+ * Stops the window from loading.
+ *
+ * ## Other resources
+ *
+ * * [The Window object]
+ * (http://www.w3.org/html/wg/drafts/html/master/browsers.html#the-window-object)
+ * from W3C.
+ */
+ @DomName('Window.stop')
+ @DocsEditable()
+ void _stop_1() => wrap_jso(JS("void ", "#.raw.stop()", this));
+
+ /// Stream of `contentloaded` events handled by this [Window].
+ @DomName('Window.onDOMContentLoaded')
+ @DocsEditable()
+ Stream<Event> get onContentLoaded => contentLoadedEvent.forTarget(this);
+
+ /// Stream of `search` events handled by this [Window].
+ @DomName('Window.onsearch')
+ @DocsEditable()
+ // http://www.w3.org/TR/html-markup/input.search.html
+ @Experimental()
+ Stream<Event> get onSearch => Element.searchEvent.forTarget(this);
+
+
+
+ /**
+ * Moves this window to a specific position.
+ *
+ * x and y can be negative.
+ *
+ * ## Other resources
+ *
+ * * [Window.moveTo]
+ * (https://developer.mozilla.org/en-US/docs/Web/API/Window.moveTo) from MDN.
+ * * [Window.moveTo]
+ * (http://dev.w3.org/csswg/cssom-view/#dom-window-moveto) from W3C.
+ */
+ void moveTo(Point p) {
+ _moveTo(p.x, p.y);
+ }
+
+ @DomName('Window.pageXOffset')
+ @DocsEditable()
+ int get pageXOffset => JS('num', '#.pageXOffset', this.raw).round();
+
+ @DomName('Window.pageYOffset')
+ @DocsEditable()
+ int get pageYOffset => JS('num', '#.pageYOffset', this.raw).round();
+
+ /**
+ * The distance this window has been scrolled horizontally.
+ *
+ * ## Other resources
+ *
+ * * [The Screen interface specification]
+ * (http://www.w3.org/TR/cssom-view/#screen) from W3C.
+ * * [scrollX]
+ * (https://developer.mozilla.org/en-US/docs/Web/API/Window.scrollX) from MDN.
+ */
+ @DomName('Window.scrollX')
+ @DocsEditable()
+ int get scrollX => JS('bool', '("scrollX" in #)', this.raw) ?
+ JS('num', '#.scrollX', this.raw).round() :
+ document.documentElement.scrollLeft;
+
+ /**
+ * The distance this window has been scrolled vertically.
+ *
+ * ## Other resources
+ *
+ * * [The Screen interface specification]
+ * (http://www.w3.org/TR/cssom-view/#screen) from W3C.
+ * * [scrollY]
+ * (https://developer.mozilla.org/en-US/docs/Web/API/Window.scrollY) from MDN.
+ */
+ @DomName('Window.scrollY')
+ @DocsEditable()
+ int get scrollY => JS('bool', '("scrollY" in #)', this.raw) ?
+ JS('num', '#.scrollY', this.raw).round() :
+ document.documentElement.scrollTop;
+
+ void postMessage(var message, String targetOrigin, [List messagePorts]) {
+ if (messagePorts != null) {
+ throw 'postMessage unsupported';
+ }
+ JS('void', '#.postMessage(#, #)', this.raw, message, targetOrigin);
+ }
+}
+
+
+// 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.
+
+
+@DocsEditable()
+@DomName('Attr')
+@Native("Attr")
+class _Attr extends Node {
+ // To suppress missing implicit constructor warnings.
+ factory _Attr._() { throw new UnsupportedError("Not supported"); }
+
+
+ @Deprecated("Internal Use Only")
+ static _Attr internalCreate_Attr() {
+ return new _Attr.internal_();
+ }
+
+ @Deprecated("Internal Use Only")
+ _Attr.internal_() : super.internal_();
+
+
+ // Use implementation from Node.
+ // final String _localName;
+
+ @DomName('Attr.name')
+ @DocsEditable()
+ String get name => wrap_jso(JS("String", "#.name", this.raw));
+
+ // Use implementation from Node.
+ // final String _namespaceUri;
+
+ // Use implementation from Node.
+ // final String nodeValue;
+
+ // Shadowing definition.
+ String get text => wrap_jso(JS("String", "#.raw.textContent", this));
+
+ set text(String value) {
+ JS("void", "#.raw.textContent = #", this, unwrap_jso(value));
+ }
+
+ @DomName('Attr.value')
+ @DocsEditable()
+ String get value => wrap_jso(JS("String", "#.value", this.raw));
+ @DomName('Attr.value')
+ @DocsEditable()
+ void set value(String val) => JS("void", "#.value = #", this.raw, unwrap_jso(val));
+}
+// Copyright (c) 2013, 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.
+
+
+@DocsEditable()
+@DomName('ClientRect')
+@Native("ClientRect")
+class _ClientRect extends DartHtmlDomObject implements Rectangle {
+
+ // NOTE! All code below should be common with RectangleBase.
+ String toString() {
+ return 'Rectangle ($left, $top) $width x $height';
+ }
+
+ bool operator ==(other) {
+ if (other is !Rectangle) return false;
+ return left == other.left && top == other.top && width == other.width &&
+ height == other.height;
+ }
+
+ int get hashCode => _JenkinsSmiHash.hash4(left.hashCode, top.hashCode,
+ width.hashCode, height.hashCode);
+
+ /**
+ * Computes the intersection of `this` and [other].
+ *
+ * The intersection of two axis-aligned rectangles, if any, is always another
+ * axis-aligned rectangle.
+ *
+ * Returns the intersection of this and `other`, or null if they don't
+ * intersect.
+ */
+ Rectangle intersection(Rectangle other) {
+ var x0 = max(left, other.left);
+ var x1 = min(left + width, other.left + other.width);
+
+ if (x0 <= x1) {
+ var y0 = max(top, other.top);
+ var y1 = min(top + height, other.top + other.height);
+
+ if (y0 <= y1) {
+ return new Rectangle(x0, y0, x1 - x0, y1 - y0);
+ }
+ }
+ return null;
+ }
+
+
+ /**
+ * Returns true if `this` intersects [other].
+ */
+ bool intersects(Rectangle<num> other) {
+ return (left <= other.left + other.width &&
+ other.left <= left + width &&
+ top <= other.top + other.height &&
+ other.top <= top + height);
+ }
+
+ /**
+ * Returns a new rectangle which completely contains `this` and [other].
+ */
+ Rectangle boundingBox(Rectangle other) {
+ var right = max(this.left + this.width, other.left + other.width);
+ var bottom = max(this.top + this.height, other.top + other.height);
+
+ var left = min(this.left, other.left);
+ var top = min(this.top, other.top);
+
+ return new Rectangle(left, top, right - left, bottom - top);
+ }
+
+ /**
+ * Tests whether `this` entirely contains [another].
+ */
+ bool containsRectangle(Rectangle<num> another) {
+ return left <= another.left &&
+ left + width >= another.left + another.width &&
+ top <= another.top &&
+ top + height >= another.top + another.height;
+ }
+
+ /**
+ * Tests whether [another] is inside or along the edges of `this`.
+ */
+ bool containsPoint(Point<num> another) {
+ return another.x >= left &&
+ another.x <= left + width &&
+ another.y >= top &&
+ another.y <= top + height;
+ }
+
+ Point get topLeft => new Point(this.left, this.top);
+ Point get topRight => new Point(this.left + this.width, this.top);
+ Point get bottomRight => new Point(this.left + this.width,
+ this.top + this.height);
+ Point get bottomLeft => new Point(this.left,
+ this.top + this.height);
+
+ // To suppress missing implicit constructor warnings.
+ factory _ClientRect._() { throw new UnsupportedError("Not supported"); }
+
+ @Deprecated("Internal Use Only")
+ static _ClientRect internalCreate_ClientRect() {
+ return new _ClientRect.internal_();
+ }
+
+ @Deprecated("Internal Use Only")
+ _ClientRect.internal_() { }
+
+
+ @DomName('ClientRect.bottom')
+ @DocsEditable()
+ double get bottom => wrap_jso(JS("double", "#.bottom", this.raw));
+
+ @DomName('ClientRect.height')
+ @DocsEditable()
+ double get height => wrap_jso(JS("double", "#.height", this.raw));
+
+ @DomName('ClientRect.left')
+ @DocsEditable()
+ double get left => wrap_jso(JS("double", "#.left", this.raw));
+
+ @DomName('ClientRect.right')
+ @DocsEditable()
+ double get right => wrap_jso(JS("double", "#.right", this.raw));
+
+ @DomName('ClientRect.top')
+ @DocsEditable()
+ double get top => wrap_jso(JS("double", "#.top", this.raw));
+
+ @DomName('ClientRect.width')
+ @DocsEditable()
+ double get width => wrap_jso(JS("double", "#.width", this.raw));
+}
+
+/**
+ * This is the [Jenkins hash function][1] but using masking to keep
+ * values in SMI range.
+ *
+ * [1]: http://en.wikipedia.org/wiki/Jenkins_hash_function
+ *
+ * Use:
+ * Hash each value with the hash of the previous value, then get the final
+ * hash by calling finish.
+ *
+ * var hash = 0;
+ * for (var value in values) {
+ * hash = JenkinsSmiHash.combine(hash, value.hashCode);
+ * }
+ * hash = JenkinsSmiHash.finish(hash);
+ */
+class _JenkinsSmiHash {
+ // TODO(11617): This class should be optimized and standardized elsewhere.
+
+ static int combine(int hash, int value) {
+ hash = 0x1fffffff & (hash + value);
+ hash = 0x1fffffff & (hash + ((0x0007ffff & hash) << 10));
+ return hash ^ (hash >> 6);
+ }
+
+ static int finish(int hash) {
+ hash = 0x1fffffff & (hash + ((0x03ffffff & hash) << 3));
+ hash = hash ^ (hash >> 11);
+ return 0x1fffffff & (hash + ((0x00003fff & hash) << 15));
+ }
+
+ static int hash2(a, b) => finish(combine(combine(0, a), b));
+
+ static int hash4(a, b, c, d) =>
+ finish(combine(combine(combine(combine(0, a), b), c), d));
+}
+// 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.
+
+
+@DocsEditable()
+@DomName('NamedNodeMap')
+// http://dom.spec.whatwg.org/#namednodemap
+@deprecated // deprecated
+@Native("NamedNodeMap,MozNamedAttrMap")
+class _NamedNodeMap extends DartHtmlDomObject with ListMixin<Node>, ImmutableListMixin<Node> implements JavaScriptIndexingBehavior, List<Node> {
+ // To suppress missing implicit constructor warnings.
+ factory _NamedNodeMap._() { throw new UnsupportedError("Not supported"); }
+
+ @Deprecated("Internal Use Only")
+ static _NamedNodeMap internalCreate_NamedNodeMap() {
+ return new _NamedNodeMap.internal_();
+ }
+
+ @Deprecated("Internal Use Only")
+ _NamedNodeMap.internal_() { }
+
+ bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+ int get hashCode => unwrap_jso(this).hashCode;
+
+ @DomName('NamedNodeMap.length')
+ @DocsEditable()
+ int get length => wrap_jso(JS("int", "#.length", this.raw));
+
+ Node operator[](int index) {
+ if (JS("bool", "# >>> 0 !== # || # >= #", index,
+ index, index, length))
+ throw new RangeError.index(index, this);
+ return wrap_jso(JS("Node", "#[#]", this.raw, index));
+ }
+ void operator[]=(int index, Node value) {
+ throw new UnsupportedError("Cannot assign element of immutable List.");
+ }
+ // -- start List<Node> mixins.
+ // Node is the element type.
+
+
+ set length(int value) {
+ throw new UnsupportedError("Cannot resize immutable List.");
+ }
+
+ Node get first {
+ if (this.length > 0) {
+ return wrap_jso(JS('Node', '#[0]', this.raw));
+ }
+ throw new StateError("No elements");
+ }
+
+ Node get last {
+ int len = this.length;
+ if (len > 0) {
+ return wrap_jso(JS('Node', '#[#]', this.raw, len - 1));
+ }
+ throw new StateError("No elements");
+ }
+
+ Node get single {
+ int len = this.length;
+ if (len == 1) {
+ return wrap_jso(JS('Node', '#[0]', this.raw));
+ }
+ if (len == 0) throw new StateError("No elements");
+ throw new StateError("More than one element");
+ }
+
+ Node elementAt(int index) => this[index];
+ // -- end List<Node> mixins.
+
+ @DomName('NamedNodeMap.__getter__')
+ @DocsEditable()
+ Node __getter__(String name) {
+ return __getter___1(name);
+ }
+ @JSName('__getter__')
+ @DomName('NamedNodeMap.__getter__')
+ @DocsEditable()
+ Node __getter___1(name) => wrap_jso(JS("Node ", "#.raw.__getter__(#)", this, unwrap_jso(name)));
+
+ @DomName('NamedNodeMap.getNamedItem')
+ @DocsEditable()
+ Node getNamedItem(String name) {
+ return _getNamedItem_1(name);
+ }
+ @JSName('getNamedItem')
+ @DomName('NamedNodeMap.getNamedItem')
+ @DocsEditable()
+ Node _getNamedItem_1(name) => wrap_jso(JS("Node ", "#.raw.getNamedItem(#)", this, unwrap_jso(name)));
+
+ @DomName('NamedNodeMap.getNamedItemNS')
+ @DocsEditable()
+ Node getNamedItemNS(String namespaceURI, String localName) {
+ return _getNamedItemNS_1(namespaceURI, localName);
+ }
+ @JSName('getNamedItemNS')
+ @DomName('NamedNodeMap.getNamedItemNS')
+ @DocsEditable()
+ Node _getNamedItemNS_1(namespaceURI, localName) => wrap_jso(JS("Node ", "#.raw.getNamedItemNS(#, #)", this, unwrap_jso(namespaceURI), unwrap_jso(localName)));
+
+ @DomName('NamedNodeMap.item')
+ @DocsEditable()
+ Node item(int index) {
+ return _item_1(index);
+ }
+ @JSName('item')
+ @DomName('NamedNodeMap.item')
+ @DocsEditable()
+ Node _item_1(index) => wrap_jso(JS("Node ", "#.raw.item(#)", this, unwrap_jso(index)));
+
+ @DomName('NamedNodeMap.removeNamedItem')
+ @DocsEditable()
+ Node removeNamedItem(String name) {
+ return _removeNamedItem_1(name);
+ }
+ @JSName('removeNamedItem')
+ @DomName('NamedNodeMap.removeNamedItem')
+ @DocsEditable()
+ Node _removeNamedItem_1(name) => wrap_jso(JS("Node ", "#.raw.removeNamedItem(#)", this, unwrap_jso(name)));
+
+ @DomName('NamedNodeMap.removeNamedItemNS')
+ @DocsEditable()
+ Node removeNamedItemNS(String namespaceURI, String localName) {
+ return _removeNamedItemNS_1(namespaceURI, localName);
+ }
+ @JSName('removeNamedItemNS')
+ @DomName('NamedNodeMap.removeNamedItemNS')
+ @DocsEditable()
+ Node _removeNamedItemNS_1(namespaceURI, localName) => wrap_jso(JS("Node ", "#.raw.removeNamedItemNS(#, #)", this, unwrap_jso(namespaceURI), unwrap_jso(localName)));
+
+ @DomName('NamedNodeMap.setNamedItem')
+ @DocsEditable()
+ Node setNamedItem(Node node) {
+ return _setNamedItem_1(node);
+ }
+ @JSName('setNamedItem')
+ @DomName('NamedNodeMap.setNamedItem')
+ @DocsEditable()
+ Node _setNamedItem_1(Node node) => wrap_jso(JS("Node ", "#.raw.setNamedItem(#)", this, unwrap_jso(node)));
+
+ @DomName('NamedNodeMap.setNamedItemNS')
+ @DocsEditable()
+ Node setNamedItemNS(Node node) {
+ return _setNamedItemNS_1(node);
+ }
+ @JSName('setNamedItemNS')
+ @DomName('NamedNodeMap.setNamedItemNS')
+ @DocsEditable()
+ Node _setNamedItemNS_1(Node node) => wrap_jso(JS("Node ", "#.raw.setNamedItemNS(#)", this, unwrap_jso(node)));
+}
+// 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.
+
+
+@DocsEditable()
+@DomName('XMLHttpRequestProgressEvent')
+@Experimental() // nonstandard
+@Native("XMLHttpRequestProgressEvent")
+class _XMLHttpRequestProgressEvent extends ProgressEvent {
+ // To suppress missing implicit constructor warnings.
+ factory _XMLHttpRequestProgressEvent._() { throw new UnsupportedError("Not supported"); }
+
+
+ @Deprecated("Internal Use Only")
+ static _XMLHttpRequestProgressEvent internalCreate_XMLHttpRequestProgressEvent() {
+ return new _XMLHttpRequestProgressEvent.internal_();
+ }
+
+ @Deprecated("Internal Use Only")
+ _XMLHttpRequestProgressEvent.internal_() : super.internal_();
+
+}
+// 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.
+
+
+abstract class _AttributeMap implements Map<String, String> {
+ final Element _element;
+
+ _AttributeMap(this._element);
+
+ void addAll(Map<String, String> other) {
+ other.forEach((k, v) { this[k] = v; });
+ }
+
+ bool containsValue(Object value) {
+ for (var v in this.values) {
+ if (value == v) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ String putIfAbsent(String key, String ifAbsent()) {
+ if (!containsKey(key)) {
+ this[key] = ifAbsent();
+ }
+ return this[key];
+ }
+
+ void clear() {
+ for (var key in keys) {
+ remove(key);
+ }
+ }
+
+ void forEach(void f(String key, String value)) {
+ for (var key in keys) {
+ var value = this[key];
+ f(key, value);
+ }
+ }
+
+ Iterable<String> get keys {
+ // TODO: generate a lazy collection instead.
+ var attributes = _element._attributes;
+ var keys = new List<String>();
+ for (int i = 0, len = attributes.length; i < len; i++) {
+ if (_matches(attributes[i])) {
+ keys.add(attributes[i].name);
+ }
+ }
+ return keys;
+ }
+
+ Iterable<String> get values {
+ // TODO: generate a lazy collection instead.
+ var attributes = _element._attributes;
+ var values = new List<String>();
+ for (int i = 0, len = attributes.length; i < len; i++) {
+ if (_matches(attributes[i])) {
+ values.add(attributes[i].value);
+ }
+ }
+ return values;
+ }
+
+ /**
+ * Returns true if there is no {key, value} pair in the map.
+ */
+ bool get isEmpty {
+ return length == 0;
+ }
+
+ /**
+ * Returns true if there is at least one {key, value} pair in the map.
+ */
+ bool get isNotEmpty => !isEmpty;
+
+ /**
+ * Checks to see if the node should be included in this map.
+ */
+ bool _matches(Node node);
+}
+
+/**
+ * Wrapper to expose [Element.attributes] as a typed map.
+ */
+class _ElementAttributeMap extends _AttributeMap {
+
+ _ElementAttributeMap(Element element): super(element);
+
+ bool containsKey(Object key) {
+ return _element._hasAttribute(key);
+ }
+
+ String operator [](Object key) {
+ return _element.getAttribute(key);
+ }
+
+ void operator []=(String key, String value) {
+ _element.setAttribute(key, value);
+ }
+
+ String remove(Object key) {
+ String value = _element.getAttribute(key);
+ _element._removeAttribute(key);
+ return value;
+ }
+
+ /**
+ * The number of {key, value} pairs in the map.
+ */
+ int get length {
+ return keys.length;
+ }
+
+ bool _matches(Node node) => node._namespaceUri == null;
+}
+
+/**
+ * Wrapper to expose namespaced attributes as a typed map.
+ */
+class _NamespacedAttributeMap extends _AttributeMap {
+
+ final String _namespace;
+
+ _NamespacedAttributeMap(Element element, this._namespace): super(element);
+
+ bool containsKey(Object key) {
+ return _element._hasAttributeNS(_namespace, key);
+ }
+
+ String operator [](Object key) {
+ return _element.getAttributeNS(_namespace, key);
+ }
+
+ void operator []=(String key, String value) {
+ _element.setAttributeNS(_namespace, key, value);
+ }
+
+ String remove(Object key) {
+ String value = this[key];
+ _element._removeAttributeNS(_namespace, key);
+ return value;
+ }
+
+ /**
+ * The number of {key, value} pairs in the map.
+ */
+ int get length {
+ return keys.length;
+ }
+
+ bool _matches(Node node) => node._namespaceUri == _namespace;
+}
+
+
+/**
+ * Provides a Map abstraction on top of data-* attributes, similar to the
+ * dataSet in the old DOM.
+ */
+class _DataAttributeMap implements Map<String, String> {
+
+ final Map<String, String> _attributes;
+
+ _DataAttributeMap(this._attributes);
+
+ // interface Map
+
+ void addAll(Map<String, String> other) {
+ other.forEach((k, v) { this[k] = v; });
+ }
+
+ // TODO: Use lazy iterator when it is available on Map.
+ bool containsValue(Object value) => values.any((v) => v == value);
+
+ bool containsKey(Object key) => _attributes.containsKey(_attr(key));
+
+ String operator [](Object key) => _attributes[_attr(key)];
+
+ void operator []=(String key, String value) {
+ _attributes[_attr(key)] = value;
+ }
+
+ String putIfAbsent(String key, String ifAbsent()) =>
+ _attributes.putIfAbsent(_attr(key), ifAbsent);
+
+ String remove(Object key) => _attributes.remove(_attr(key));
+
+ void clear() {
+ // Needs to operate on a snapshot since we are mutating the collection.
+ for (String key in keys) {
+ remove(key);
+ }
+ }
+
+ void forEach(void f(String key, String value)) {
+ _attributes.forEach((String key, String value) {
+ if (_matches(key)) {
+ f(_strip(key), value);
+ }
+ });
+ }
+
+ Iterable<String> get keys {
+ final keys = new List<String>();
+ _attributes.forEach((String key, String value) {
+ if (_matches(key)) {
+ keys.add(_strip(key));
+ }
+ });
+ return keys;
+ }
+
+ Iterable<String> get values {
+ final values = new List<String>();
+ _attributes.forEach((String key, String value) {
+ if (_matches(key)) {
+ values.add(value);
+ }
+ });
+ return values;
+ }
+
+ int get length => keys.length;
+
+ // TODO: Use lazy iterator when it is available on Map.
+ bool get isEmpty => length == 0;
+
+ bool get isNotEmpty => !isEmpty;
+
+ // Helpers.
+ String _attr(String key) => 'data-${_toHyphenedName(key)}';
+ bool _matches(String key) => key.startsWith('data-');
+ String _strip(String key) => _toCamelCase(key.substring(5));
+
+ /**
+ * Converts a string name with hyphens into an identifier, by removing hyphens
+ * and capitalizing the following letter. Optionally [startUppercase] to
+ * captialize the first letter.
+ */
+ String _toCamelCase(String hyphenedName, {bool startUppercase: false}) {
+ var segments = hyphenedName.split('-');
+ int start = startUppercase ? 0 : 1;
+ for (int i = start; i < segments.length; i++) {
+ var segment = segments[i];
+ if (segment.length > 0) {
+ // Character between 'a'..'z' mapped to 'A'..'Z'
+ segments[i] = '${segment[0].toUpperCase()}${segment.substring(1)}';
+ }
+ }
+ return segments.join('');
+ }
+
+ /** Reverse of [toCamelCase]. */
+ String _toHyphenedName(String word) {
+ var sb = new StringBuffer();
+ for (int i = 0; i < word.length; i++) {
+ var lower = word[i].toLowerCase();
+ if (word[i] != lower && i > 0) sb.write('-');
+ sb.write(lower);
+ }
+ return sb.toString();
+ }
+}
+// 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.
+
+
+/**
+ * An object that can be drawn to a 2D canvas rendering context.
+ *
+ * The image drawn to the canvas depends on the type of this object:
+ *
+ * * If this object is an [ImageElement], then this element's image is
+ * drawn to the canvas. If this element is an animated image, then this
+ * element's poster frame is drawn. If this element has no poster frame, then
+ * the first frame of animation is drawn.
+ *
+ * * If this object is a [VideoElement], then the frame at this element's current
+ * playback position is drawn to the canvas.
+ *
+ * * If this object is a [CanvasElement], then this element's bitmap is drawn to
+ * the canvas.
+ *
+ * **Note:** Currently all versions of Internet Explorer do not support
+ * drawing a video element to a canvas. You may also encounter problems drawing
+ * a video to a canvas in Firefox if the source of the video is a data URL.
+ *
+ * ## See also
+ *
+ * * [CanvasRenderingContext2D.drawImage]
+ * * [CanvasRenderingContext2D.drawImageToRect]
+ * * [CanvasRenderingContext2D.drawImageScaled]
+ * * [CanvasRenderingContext2D.drawImageScaledFromSource]
+ *
+ * ## Other resources
+ *
+ * * [Image sources for 2D rendering contexts]
+ * (http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#image-sources-for-2d-rendering-contexts)
+ * from WHATWG.
+ * * [Drawing images]
+ * (http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#dom-context-2d-drawimage)
+ * from WHATWG.
+ */
+abstract class CanvasImageSource {}
+// 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.
+
+
+/**
+ * Top-level container for a browser tab or window.
+ *
+ * In a web browser, a [WindowBase] object represents any browser window. This
+ * object contains the window's state and its relation to other
+ * windows, such as which window opened this window.
+ *
+ * **Note:** This class represents any window, while [Window] is
+ * used to access the properties and content of the current window or tab.
+ *
+ * ## See also
+ *
+ * * [Window]
+ *
+ * ## Other resources
+ *
+ * * [DOM Window](https://developer.mozilla.org/en-US/docs/DOM/window) from MDN.
+ * * [Window](http://www.w3.org/TR/Window/) from the W3C.
+ */
+abstract class WindowBase implements EventTarget {
+ // Fields.
+
+ /**
+ * The current location of this window.
+ *
+ * Location currentLocation = window.location;
+ * print(currentLocation.href); // 'http://www.example.com:80/'
+ */
+ LocationBase get location;
+
+ /**
+ * The current session history for this window.
+ *
+ * ## Other resources
+ *
+ * * [Session history and navigation specification]
+ * (http://www.whatwg.org/specs/web-apps/current-work/multipage/history.html)
+ * from WHATWG.
+ */
+ HistoryBase get history;
+
+ /**
+ * Indicates whether this window has been closed.
+ *
+ * print(window.closed); // 'false'
+ * window.close();
+ * print(window.closed); // 'true'
+ */
+ bool get closed;
+
+ /**
+ * A reference to the window that opened this one.
+ *
+ * Window thisWindow = window;
+ * WindowBase otherWindow = thisWindow.open('http://www.example.com/', 'foo');
+ * print(otherWindow.opener == thisWindow); // 'true'
+ */
+ WindowBase get opener;
+
+ /**
+ * A reference to the parent of this window.
+ *
+ * If this [WindowBase] has no parent, [parent] will return a reference to
+ * the [WindowBase] itself.
+ *
+ * IFrameElement myIFrame = new IFrameElement();
+ * window.document.body.elements.add(myIFrame);
+ * print(myIframe.contentWindow.parent == window) // 'true'
+ *
+ * print(window.parent == window) // 'true'
+ */
+ WindowBase get parent;
+
+ /**
+ * A reference to the topmost window in the window hierarchy.
+ *
+ * If this [WindowBase] is the topmost [WindowBase], [top] will return a
+ * reference to the [WindowBase] itself.
+ *
+ * // Add an IFrame to the current window.
+ * IFrameElement myIFrame = new IFrameElement();
+ * window.document.body.elements.add(myIFrame);
+ *
+ * // Add an IFrame inside of the other IFrame.
+ * IFrameElement innerIFrame = new IFrameElement();
+ * myIFrame.elements.add(innerIFrame);
+ *
+ * print(myIframe.contentWindow.top == window) // 'true'
+ * print(innerIFrame.contentWindow.top == window) // 'true'
+ *
+ * print(window.top == window) // 'true'
+ */
+ WindowBase get top;
+
+ // Methods.
+ /**
+ * Closes the window.
+ *
+ * This method should only succeed if the [WindowBase] object is
+ * **script-closeable** and the window calling [close] is allowed to navigate
+ * the window.
+ *
+ * A window is script-closeable if it is either a window
+ * that was opened by another window, or if it is a window with only one
+ * document in its history.
+ *
+ * A window might not be allowed to navigate, and therefore close, another
+ * window due to browser security features.
+ *
+ * var other = window.open('http://www.example.com', 'foo');
+ * // Closes other window, as it is script-closeable.
+ * other.close();
+ * print(other.closed()); // 'true'
+ *
+ * window.location('http://www.mysite.com', 'foo');
+ * // Does not close this window, as the history has changed.
+ * window.close();
+ * print(window.closed()); // 'false'
+ *
+ * See also:
+ *
+ * * [Window close discussion](http://www.w3.org/TR/html5/browsers.html#dom-window-close) from the W3C
+ */
+ void close();
+
+ /**
+ * Sends a cross-origin message.
+ *
+ * ## Other resources
+ *
+ * * [window.postMessage]
+ * (https://developer.mozilla.org/en-US/docs/Web/API/Window.postMessage) from
+ * MDN.
+ * * [Cross-document messaging]
+ * (http://www.whatwg.org/specs/web-apps/current-work/multipage/web-messaging.html)
+ * from WHATWG.
+ */
+ void postMessage(var message, String targetOrigin, [List messagePorts]);
+}
+
+abstract class LocationBase {
+ void set href(String val);
+}
+
+abstract class HistoryBase {
+ void back();
+ void forward();
+ void go(int distance);
+}
+// 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.
+
+
+/** A Set that stores the CSS class names for an element. */
+abstract class CssClassSet implements Set<String> {
+
+ /**
+ * Adds the class [value] to the element if it is not on it, removes it if it
+ * is.
+ *
+ * If [shouldAdd] is true, then we always add that [value] to the element. If
+ * [shouldAdd] is false then we always remove [value] from the element.
+ *
+ * If this corresponds to one element, returns `true` if [value] is present
+ * after the operation, and returns `false` if [value] is absent after the
+ * operation.
+ *
+ * If this corresponds to many elements, `null` is always returned.
+ *
+ * [value] must be a valid 'token' representing a single class, i.e. a
+ * non-empty string containing no whitespace. To toggle multiple classes, use
+ * [toggleAll].
+ */
+ bool toggle(String value, [bool shouldAdd]);
+
+ /**
+ * Returns [:true:] if classes cannot be added or removed from this
+ * [:CssClassSet:].
+ */
+ bool get frozen;
+
+ /**
+ * Determine if this element contains the class [value].
+ *
+ * This is the Dart equivalent of jQuery's
+ * [hasClass](http://api.jquery.com/hasClass/).
+ *
+ * [value] must be a valid 'token' representing a single class, i.e. a
+ * non-empty string containing no whitespace.
+ */
+ bool contains(Object value);
+
+ /**
+ * Add the class [value] to element.
+ *
+ * [add] and [addAll] are the Dart equivalent of jQuery's
+ * [addClass](http://api.jquery.com/addClass/).
+ *
+ * If this CssClassSet corresponds to one element. Returns true if [value] was
+ * added to the set, otherwise false.
+ *
+ * If this corresponds to many elements, `null` is always returned.
+ *
+ * [value] must be a valid 'token' representing a single class, i.e. a
+ * non-empty string containing no whitespace. To add multiple classes use
+ * [addAll].
+ */
+ bool add(String value);
+
+ /**
+ * Remove the class [value] from element, and return true on successful
+ * removal.
+ *
+ * [remove] and [removeAll] are the Dart equivalent of jQuery's
+ * [removeClass](http://api.jquery.com/removeClass/).
+ *
+ * [value] must be a valid 'token' representing a single class, i.e. a
+ * non-empty string containing no whitespace. To remove multiple classes, use
+ * [removeAll].
+ */
+ bool remove(Object value);
+
+ /**
+ * Add all classes specified in [iterable] to element.
+ *
+ * [add] and [addAll] are the Dart equivalent of jQuery's
+ * [addClass](http://api.jquery.com/addClass/).
+ *
+ * Each element of [iterable] must be a valid 'token' representing a single
+ * class, i.e. a non-empty string containing no whitespace.
+ */
+ void addAll(Iterable<String> iterable);
+
+ /**
+ * Remove all classes specified in [iterable] from element.
+ *
+ * [remove] and [removeAll] are the Dart equivalent of jQuery's
+ * [removeClass](http://api.jquery.com/removeClass/).
+ *
+ * Each element of [iterable] must be a valid 'token' representing a single
+ * class, i.e. a non-empty string containing no whitespace.
+ */
+ void removeAll(Iterable<Object> iterable);
+
+ /**
+ * Toggles all classes specified in [iterable] on element.
+ *
+ * Iterate through [iterable]'s items, and add it if it is not on it, or
+ * remove it if it is. This is the Dart equivalent of jQuery's
+ * [toggleClass](http://api.jquery.com/toggleClass/).
+ * If [shouldAdd] is true, then we always add all the classes in [iterable]
+ * element. If [shouldAdd] is false then we always remove all the classes in
+ * [iterable] from the element.
+ *
+ * Each element of [iterable] must be a valid 'token' representing a single
+ * class, i.e. a non-empty string containing no whitespace.
+ */
+ void toggleAll(Iterable<String> iterable, [bool shouldAdd]);
+}
+// Copyright (c) 2013, 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.
+
+
+/**
+ * A rectangle representing all the content of the element in the
+ * [box model](http://www.w3.org/TR/CSS2/box.html).
+ */
+class _ContentCssRect extends CssRect {
+
+ _ContentCssRect(element) : super(element);
+
+ num get height => _element.offsetHeight +
+ _addOrSubtractToBoxModel(_HEIGHT, _CONTENT);
+
+ num get width => _element.offsetWidth +
+ _addOrSubtractToBoxModel(_WIDTH, _CONTENT);
+
+ /**
+ * Set the height to `newHeight`.
+ *
+ * newHeight can be either a [num] representing the height in pixels or a
+ * [Dimension] object. Values of newHeight that are less than zero are
+ * converted to effectively setting the height to 0. This is equivalent to the
+ * `height` function in jQuery and the calculated `height` CSS value,
+ * converted to a num in pixels.
+ */
+ set height(Object newHeight) {
+ if (newHeight is Dimension) {
+ var result = (newHeight.value < 0) ? new Dimension.px(0) : newHeight;
+ _element.style.height = result.toString();
+ } else {
+ var result = ((newHeight as int) < 0) ? 0 : newHeight;
+ _element.style.height = '${result}px';
+ }
+ }
+
+ /**
+ * Set the current computed width in pixels of this element.
+ *
+ * newWidth can be either a [num] representing the width in pixels or a
+ * [Dimension] object. This is equivalent to the `width` function in jQuery
+ * and the calculated
+ * `width` CSS value, converted to a dimensionless num in pixels.
+ */
+ set width(Object newWidth) {
+ if (newWidth is Dimension) {
+ var result = (newWidth.value < 0) ? new Dimension.px(0) : newWidth;
+ _element.style.width = result.toString();
+ } else {
+ var result = ((newWidth as int) < 0) ? 0 : newWidth;
+ _element.style.width = '${result}px';
+ }
+ }
+
+ num get left => _element.getBoundingClientRect().left -
+ _addOrSubtractToBoxModel(['left'], _CONTENT);
+ num get top => _element.getBoundingClientRect().top -
+ _addOrSubtractToBoxModel(['top'], _CONTENT);
+}
+
+/**
+ * A list of element content rectangles in the
+ * [box model](http://www.w3.org/TR/CSS2/box.html).
+ */
+class _ContentCssListRect extends _ContentCssRect {
+ List<Element> _elementList;
+
+ _ContentCssListRect(elementList) : super(elementList.first) {
+ _elementList = elementList;
+ }
+
+ /**
+ * Set the height to `newHeight`.
+ *
+ * Values of newHeight that are less than zero are converted to effectively
+ * setting the height to 0. This is equivalent to the `height`
+ * function in jQuery and the calculated `height` CSS value, converted to a
+ * num in pixels.
+ */
+ set height(newHeight) {
+ _elementList.forEach((e) => e.contentEdge.height = newHeight);
+ }
+
+ /**
+ * Set the current computed width in pixels of this element.
+ *
+ * This is equivalent to the `width` function in jQuery and the calculated
+ * `width` CSS value, converted to a dimensionless num in pixels.
+ */
+ set width(newWidth) {
+ _elementList.forEach((e) => e.contentEdge.width = newWidth);
+ }
+}
+
+/**
+ * A rectangle representing the dimensions of the space occupied by the
+ * element's content + padding in the
+ * [box model](http://www.w3.org/TR/CSS2/box.html).
+ */
+class _PaddingCssRect extends CssRect {
+ _PaddingCssRect(element) : super(element);
+ num get height => _element.offsetHeight +
+ _addOrSubtractToBoxModel(_HEIGHT, _PADDING);
+ num get width => _element.offsetWidth +
+ _addOrSubtractToBoxModel(_WIDTH, _PADDING);
+
+ num get left => _element.getBoundingClientRect().left -
+ _addOrSubtractToBoxModel(['left'], _PADDING);
+ num get top => _element.getBoundingClientRect().top -
+ _addOrSubtractToBoxModel(['top'], _PADDING);
+}
+
+/**
+ * A rectangle representing the dimensions of the space occupied by the
+ * element's content + padding + border in the
+ * [box model](http://www.w3.org/TR/CSS2/box.html).
+ */
+class _BorderCssRect extends CssRect {
+ _BorderCssRect(element) : super(element);
+ num get height => _element.offsetHeight;
+ num get width => _element.offsetWidth;
+
+ num get left => _element.getBoundingClientRect().left;
+ num get top => _element.getBoundingClientRect().top;
+}
+
+/**
+ * A rectangle representing the dimensions of the space occupied by the
+ * element's content + padding + border + margin in the
+ * [box model](http://www.w3.org/TR/CSS2/box.html).
+ */
+class _MarginCssRect extends CssRect {
+ _MarginCssRect(element) : super(element);
+ num get height => _element.offsetHeight +
+ _addOrSubtractToBoxModel(_HEIGHT, _MARGIN);
+ num get width =>
+ _element.offsetWidth + _addOrSubtractToBoxModel(_WIDTH, _MARGIN);
+
+ num get left => _element.getBoundingClientRect().left -
+ _addOrSubtractToBoxModel(['left'], _MARGIN);
+ num get top => _element.getBoundingClientRect().top -
+ _addOrSubtractToBoxModel(['top'], _MARGIN);
+}
+
+/**
+ * A class for representing CSS dimensions.
+ *
+ * In contrast to the more general purpose [Rectangle] class, this class's
+ * values are mutable, so one can change the height of an element
+ * programmatically.
+ *
+ * _Important_ _note_: use of these methods will perform CSS calculations that
+ * can trigger a browser reflow. Therefore, use of these properties _during_ an
+ * animation frame is discouraged. See also:
+ * [Browser Reflow](https://developers.google.com/speed/articles/reflow)
+ */
+abstract class CssRect extends MutableRectangle<num> {
+ Element _element;
+
+ CssRect(this._element) : super(0, 0, 0, 0);
+
+ num get left;
+
+ num get top;
+
+ /**
+ * The height of this rectangle.
+ *
+ * This is equivalent to the `height` function in jQuery and the calculated
+ * `height` CSS value, converted to a dimensionless num in pixels. Unlike
+ * [getBoundingClientRect], `height` will return the same numerical width if
+ * the element is hidden or not.
+ */
+ num get height;
+
+ /**
+ * The width of this rectangle.
+ *
+ * This is equivalent to the `width` function in jQuery and the calculated
+ * `width` CSS value, converted to a dimensionless num in pixels. Unlike
+ * [getBoundingClientRect], `width` will return the same numerical width if
+ * the element is hidden or not.
+ */
+ num get width;
+
+ /**
+ * Set the height to `newHeight`.
+ *
+ * newHeight can be either a [num] representing the height in pixels or a
+ * [Dimension] object. Values of newHeight that are less than zero are
+ * converted to effectively setting the height to 0. This is equivalent to the
+ * `height` function in jQuery and the calculated `height` CSS value,
+ * converted to a num in pixels.
+ *
+ * Note that only the content height can actually be set via this method.
+ */
+ set height(newHeight) {
+ throw new UnsupportedError("Can only set height for content rect.");
+ }
+
+ /**
+ * Set the current computed width in pixels of this element.
+ *
+ * newWidth can be either a [num] representing the width in pixels or a
+ * [Dimension] object. This is equivalent to the `width` function in jQuery
+ * and the calculated
+ * `width` CSS value, converted to a dimensionless num in pixels.
+ *
+ * Note that only the content width can be set via this method.
+ */
+ set width(newWidth) {
+ throw new UnsupportedError("Can only set width for content rect.");
+ }
+
+ /**
+ * Return a value that is used to modify the initial height or width
+ * measurement of an element. Depending on the value (ideally an enum) passed
+ * to augmentingMeasurement, we may need to add or subtract margin, padding,
+ * or border values, depending on the measurement we're trying to obtain.
+ */
+ num _addOrSubtractToBoxModel(List<String> dimensions,
+ String augmentingMeasurement) {
+ // getComputedStyle always returns pixel values (hence, computed), so we're
+ // always dealing with pixels in this method.
+ var styles = _element.getComputedStyle();
+
+ var val = 0;
+
+ for (String measurement in dimensions) {
+ // The border-box and default box model both exclude margin in the regular
+ // height/width calculation, so add it if we want it for this measurement.
+ if (augmentingMeasurement == _MARGIN) {
+ val += new Dimension.css(styles.getPropertyValue(
+ '$augmentingMeasurement-$measurement')).value;
+ }
+
+ // The border-box includes padding and border, so remove it if we want
+ // just the content itself.
+ if (augmentingMeasurement == _CONTENT) {
+ val -= new Dimension.css(
+ styles.getPropertyValue('${_PADDING}-$measurement')).value;
+ }
+
+ // At this point, we don't wan't to augment with border or margin,
+ // so remove border.
+ if (augmentingMeasurement != _MARGIN) {
+ val -= new Dimension.css(styles.getPropertyValue(
+ 'border-${measurement}-width')).value;
+ }
+ }
+ return val;
+ }
+}
+
+final _HEIGHT = ['top', 'bottom'];
+final _WIDTH = ['right', 'left'];
+final _CONTENT = 'content';
+final _PADDING = 'padding';
+final _MARGIN = 'margin';
+// Copyright (c) 2015, 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.
+
+
+/**
+ * A set (union) of the CSS classes that are present in a set of elements.
+ * Implemented separately from _ElementCssClassSet for performance.
+ */
+class _MultiElementCssClassSet extends CssClassSetImpl {
+ final Iterable<Element> _elementIterable;
+
+ // TODO(sra): Perhaps we should store the DomTokenList instead.
+ final List<CssClassSetImpl> _sets;
+
+ factory _MultiElementCssClassSet(Iterable<Element> elements) {
+ return new _MultiElementCssClassSet._(elements,
+ elements.map((Element e) => e.classes).toList());
+ }
+
+ _MultiElementCssClassSet._(this._elementIterable, this._sets);
+
+ Set<String> readClasses() {
+ var s = new LinkedHashSet<String>();
+ _sets.forEach((CssClassSetImpl e) => s.addAll(e.readClasses()));
+ return s;
+ }
+
+ void writeClasses(Set<String> s) {
+ var classes = s.join(' ');
+ for (Element e in _elementIterable) {
+ e.className = classes;
+ }
+ }
+
+ /**
+ * Helper method used to modify the set of css classes on this element.
+ *
+ * f - callback with:
+ * s - a Set of all the css class name currently on this element.
+ *
+ * After f returns, the modified set is written to the
+ * className property of this element.
+ */
+ modify( f(Set<String> s)) {
+ _sets.forEach((CssClassSetImpl e) => e.modify(f));
+ }
+
+ /**
+ * Adds the class [value] to the element if it is not on it, removes it if it
+ * is.
+ *
+ * TODO(sra): It seems wrong to collect a 'changed' flag like this when the
+ * underlying toggle returns an 'is set' flag.
+ */
+ bool toggle(String value, [bool shouldAdd]) =>
+ _sets.fold(false,
+ (bool changed, CssClassSetImpl e) =>
+ e.toggle(value, shouldAdd) || changed);
+
+ /**
+ * Remove the class [value] from element, and return true on successful
+ * removal.
+ *
+ * This is the Dart equivalent of jQuery's
+ * [removeClass](http://api.jquery.com/removeClass/).
+ */
+ bool remove(Object value) => _sets.fold(false,
+ (bool changed, CssClassSetImpl e) => e.remove(value) || changed);
+}
+
+class _ElementCssClassSet extends CssClassSetImpl {
+ final Element _element;
+
+ _ElementCssClassSet(this._element);
+
+ Set<String> readClasses() {
+ var s = new LinkedHashSet<String>();
+ var classname = _element.className;
+
+ for (String name in classname.split(' ')) {
+ String trimmed = name.trim();
+ if (!trimmed.isEmpty) {
+ s.add(trimmed);
+ }
+ }
+ return s;
+ }
+
+ void writeClasses(Set<String> s) {
+ _element.className = s.join(' ');
+ }
+
+ int get length => _classListLength(_classListOf(_element));
+ bool get isEmpty => length == 0;
+ bool get isNotEmpty => length != 0;
+
+ void clear() {
+ _element.className = '';
+ }
+
+ bool contains(Object value) {
+ return _contains(_element, value);
+ }
+
+ bool add(String value) {
+ return _add(_element, value);
+ }
+
+ bool remove(Object value) {
+ return value is String && _remove(_element, value);
+ }
+
+ bool toggle(String value, [bool shouldAdd]) {
+ return _toggle(_element, value, shouldAdd);
+ }
+
+ void addAll(Iterable<String> iterable) {
+ _addAll(_element, iterable);
+ }
+
+ void removeAll(Iterable<Object> iterable) {
+ _removeAll(_element, iterable);
+ }
+
+ void retainAll(Iterable<Object> iterable) {
+ _removeWhere(_element, iterable.toSet().contains, false);
+ }
+
+ void removeWhere(bool test(String name)) {
+ _removeWhere(_element, test, true);
+ }
+
+ void retainWhere(bool test(String name)) {
+ _removeWhere(_element, test, false);
+ }
+
+ static bool _contains(Element _element, Object value) {
+ return value is String && _classListContains(_classListOf(_element), value);
+ }
+
+ static bool _add(Element _element, String value) {
+ DomTokenList list = _classListOf(_element);
+ // Compute returned result independently of action upon the set.
+ bool added = !_classListContainsBeforeAddOrRemove(list, value);
+ _classListAdd(list, value);
+ return added;
+ }
+
+ static bool _remove(Element _element, String value) {
+ DomTokenList list = _classListOf(_element);
+ bool removed = _classListContainsBeforeAddOrRemove(list, value);
+ _classListRemove(list, value);
+ return removed;
+ }
+
+ static bool _toggle(Element _element, String value, bool shouldAdd) {
+ // There is no value that can be passed as the second argument of
+ // DomTokenList.toggle that behaves the same as passing one argument.
+ // `null` is seen as false, meaning 'remove'.
+ return shouldAdd == null
+ ? _toggleDefault(_element, value)
+ : _toggleOnOff(_element, value, shouldAdd);
+ }
+
+ static bool _toggleDefault(Element _element, String value) {
+ DomTokenList list = _classListOf(_element);
+ return _classListToggle1(list, value);
+ }
+
+ static bool _toggleOnOff(Element _element, String value, bool shouldAdd) {
+ DomTokenList list = _classListOf(_element);
+ // IE's toggle does not take a second parameter. We would prefer:
+ //
+ // return _classListToggle2(list, value, shouldAdd);
+ //
+ if (shouldAdd) {
+ _classListAdd(list, value);
+ return true;
+ } else {
+ _classListRemove(list, value);
+ return false;
+ }
+ }
+
+ static void _addAll(Element _element, Iterable<String> iterable) {
+ DomTokenList list = _classListOf(_element);
+ for (String value in iterable) {
+ _classListAdd(list, value);
+ }
+ }
+
+ static void _removeAll(Element _element, Iterable<String> iterable) {
+ DomTokenList list = _classListOf(_element);
+ for (var value in iterable) {
+ _classListRemove(list, value);
+ }
+ }
+
+ static void _removeWhere(
+ Element _element, bool test(String name), bool doRemove) {
+ DomTokenList list = _classListOf(_element);
+ int i = 0;
+ while (i < _classListLength(list)) {
+ String item = list.item(i);
+ if (doRemove == test(item)) {
+ _classListRemove(list, item);
+ } else {
+ ++i;
+ }
+ }
+ }
+
+ // A collection of static methods for DomTokenList. These methods are a
+ // work-around for the lack of annotations to express the full behaviour of
+ // the DomTokenList methods.
+
+ static DomTokenList _classListOf(Element e) =>
+ wrap_jso(JS('returns:DomTokenList;creates:DomTokenList;effects:none;depends:all;',
+ '#.classList', e.raw));
+
+ static int _classListLength(DomTokenList list) =>
+ JS('returns:JSUInt31;effects:none;depends:all;', '#.length', list.raw);
+
+ static bool _classListContains(DomTokenList list, String value) =>
+ JS('returns:bool;effects:none;depends:all',
+ '#.contains(#)', list.raw, value);
+
+ static bool _classListContainsBeforeAddOrRemove(
+ DomTokenList list, String value) =>
+ // 'throws:never' is a lie, since 'contains' will throw on an illegal
+ // token. However, we always call this function immediately prior to
+ // add/remove/toggle with the same token. Often the result of 'contains'
+ // is unused and the lie makes it possible for the 'contains' instruction
+ // to be removed.
+ JS('returns:bool;effects:none;depends:all;throws:null(1)',
+ '#.contains(#)', list.raw, value);
+
+ static void _classListAdd(DomTokenList list, String value) {
+ // list.add(value);
+ JS('', '#.add(#)', list.raw, value);
+ }
+
+ static void _classListRemove(DomTokenList list, String value) {
+ // list.remove(value);
+ JS('', '#.remove(#)', list.raw, value);
+ }
+
+ static bool _classListToggle1(DomTokenList list, String value) {
+ return JS('bool', '#.toggle(#)', list.raw, value);
+ }
+
+ static bool _classListToggle2(
+ DomTokenList list, String value, bool shouldAdd) {
+ return JS('bool', '#.toggle(#, #)', list.raw, value, shouldAdd);
+ }
+}
+
+/**
+ * Class representing a
+ * [length measurement](https://developer.mozilla.org/en-US/docs/Web/CSS/length)
+ * in CSS.
+ */
+@Experimental()
+class Dimension {
+ num _value;
+ String _unit;
+
+ /** Set this CSS Dimension to a percentage `value`. */
+ Dimension.percent(this._value) : _unit = '%';
+
+ /** Set this CSS Dimension to a pixel `value`. */
+ Dimension.px(this._value) : _unit = 'px';
+
+ /** Set this CSS Dimension to a pica `value`. */
+ Dimension.pc(this._value) : _unit = 'pc';
+
+ /** Set this CSS Dimension to a point `value`. */
+ Dimension.pt(this._value) : _unit = 'pt';
+
+ /** Set this CSS Dimension to an inch `value`. */
+ Dimension.inch(this._value) : _unit = 'in';
+
+ /** Set this CSS Dimension to a centimeter `value`. */
+ Dimension.cm(this._value) : _unit = 'cm';
+
+ /** Set this CSS Dimension to a millimeter `value`. */
+ Dimension.mm(this._value) : _unit = 'mm';
+
+ /**
+ * Set this CSS Dimension to the specified number of ems.
+ *
+ * 1em is equal to the current font size. (So 2ems is equal to double the font
+ * size). This is useful for producing website layouts that scale nicely with
+ * the user's desired font size.
+ */
+ Dimension.em(this._value) : _unit = 'em';
+
+ /**
+ * Set this CSS Dimension to the specified number of x-heights.
+ *
+ * One ex is equal to the the x-height of a font's baseline to its mean line,
+ * generally the height of the letter "x" in the font, which is usually about
+ * half the font-size.
+ */
+ Dimension.ex(this._value) : _unit = 'ex';
+
+ /**
+ * Construct a Dimension object from the valid, simple CSS string `cssValue`
+ * that represents a distance measurement.
+ *
+ * This constructor is intended as a convenience method for working with
+ * simplistic CSS length measurements. Non-numeric values such as `auto` or
+ * `inherit` or invalid CSS will cause this constructor to throw a
+ * FormatError.
+ */
+ Dimension.css(String cssValue) {
+ if (cssValue == '') cssValue = '0px';
+ if (cssValue.endsWith('%')) {
+ _unit = '%';
+ } else {
+ _unit = cssValue.substring(cssValue.length - 2);
+ }
+ if (cssValue.contains('.')) {
+ _value = double.parse(cssValue.substring(0,
+ cssValue.length - _unit.length));
+ } else {
+ _value = int.parse(cssValue.substring(0, cssValue.length - _unit.length));
+ }
+ }
+
+ /** Print out the CSS String representation of this value. */
+ String toString() {
+ return '${_value}${_unit}';
+ }
+
+ /** Return a unitless, numerical value of this CSS value. */
+ num get value => this._value;
+}
+// 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.
+
+
+typedef EventListener(Event event);
+// Copyright (c) 2013, 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.
+
+
+/**
+ * A factory to expose DOM events as Streams.
+ */
+class EventStreamProvider<T extends Event> {
+ final String _eventType;
+
+ const EventStreamProvider(this._eventType);
+
+ /**
+ * Gets a [Stream] for this event type, on the specified target.
+ *
+ * This will always return a broadcast stream so multiple listeners can be
+ * used simultaneously.
+ *
+ * This may be used to capture DOM events:
+ *
+ * Element.keyDownEvent.forTarget(element, useCapture: true).listen(...);
+ *
+ * // Alternate method:
+ * Element.keyDownEvent.forTarget(element).capture(...);
+ *
+ * Or for listening to an event which will bubble through the DOM tree:
+ *
+ * MediaElement.pauseEvent.forTarget(document.body).listen(...);
+ *
+ * See also:
+ *
+ * [addEventListener](http://docs.webplatform.org/wiki/dom/methods/addEventListener)
+ */
+ Stream<T> forTarget(EventTarget e, {bool useCapture: false}) =>
+ new _EventStream(e, _eventType, useCapture);
+
+ /**
+ * Gets an [ElementEventStream] for this event type, on the specified element.
+ *
+ * This will always return a broadcast stream so multiple listeners can be
+ * used simultaneously.
+ *
+ * This may be used to capture DOM events:
+ *
+ * Element.keyDownEvent.forElement(element, useCapture: true).listen(...);
+ *
+ * // Alternate method:
+ * Element.keyDownEvent.forElement(element).capture(...);
+ *
+ * Or for listening to an event which will bubble through the DOM tree:
+ *
+ * MediaElement.pauseEvent.forElement(document.body).listen(...);
+ *
+ * See also:
+ *
+ * [addEventListener](http://docs.webplatform.org/wiki/dom/methods/addEventListener)
+ */
+ ElementStream<T> forElement(Element e, {bool useCapture: false}) {
+ return new _ElementEventStreamImpl(e, _eventType, useCapture);
+ }
+
+ /**
+ * Gets an [ElementEventStream] for this event type, on the list of elements.
+ *
+ * This will always return a broadcast stream so multiple listeners can be
+ * used simultaneously.
+ *
+ * This may be used to capture DOM events:
+ *
+ * Element.keyDownEvent._forElementList(element, useCapture: true).listen(...);
+ *
+ * See also:
+ *
+ * [addEventListener](http://docs.webplatform.org/wiki/dom/methods/addEventListener)
+ */
+ ElementStream<T> _forElementList(ElementList e, {bool useCapture: false}) {
+ return new _ElementListEventStreamImpl(e, _eventType, useCapture);
+ }
+
+ /**
+ * Gets the type of the event which this would listen for on the specified
+ * event target.
+ *
+ * The target is necessary because some browsers may use different event names
+ * for the same purpose and the target allows differentiating browser support.
+ */
+ String getEventType(EventTarget target) {
+ return _eventType;
+ }
+}
+
+/** A specialized Stream available to [Element]s to enable event delegation. */
+abstract class ElementStream<T extends Event> implements Stream<T> {
+ /**
+ * Return a stream that only fires when the particular event fires for
+ * elements matching the specified CSS selector.
+ *
+ * This is the Dart equivalent to jQuery's
+ * [delegate](http://api.jquery.com/delegate/).
+ */
+ Stream<T> matches(String selector);
+
+ /**
+ * Adds a capturing subscription to this stream.
+ *
+ * If the target of the event is a descendant of the element from which this
+ * stream derives then [onData] is called before the event propagates down to
+ * the target. This is the opposite of bubbling behavior, where the event
+ * is first processed for the event target and then bubbles upward.
+ *
+ * ## Other resources
+ *
+ * * [Event Capture]
+ * (http://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-flow-capture)
+ * from the W3C DOM Events specification.
+ */
+ StreamSubscription<T> capture(void onData(T event));
+}
+
+/**
+ * Adapter for exposing DOM events as Dart streams.
+ */
+class _EventStream<T extends Event> extends Stream<T> {
+ final EventTarget _target;
+ final String _eventType;
+ final bool _useCapture;
+
+ _EventStream(this._target, this._eventType, this._useCapture);
+
+ // DOM events are inherently multi-subscribers.
+ Stream<T> asBroadcastStream({void onListen(StreamSubscription<T> subscription),
+ void onCancel(StreamSubscription<T> subscription)})
+ => this;
+ bool get isBroadcast => true;
+
+ StreamSubscription<T> listen(void onData(T event),
+ { Function onError,
+ void onDone(),
+ bool cancelOnError}) {
+
+ return new _EventStreamSubscription<T>(
+ this._target, this._eventType, onData, this._useCapture);
+ }
+}
+
+/**
+ * Adapter for exposing DOM Element events as streams, while also allowing
+ * event delegation.
+ */
+class _ElementEventStreamImpl<T extends Event> extends _EventStream<T>
+ implements ElementStream<T> {
+ _ElementEventStreamImpl(target, eventType, useCapture) :
+ super(target, eventType, useCapture);
+
+ Stream<T> matches(String selector) => this.where(
+ (event) => event.target.matchesWithAncestors(selector)).map((e) {
+ e._selector = selector;
+ return e;
+ });
+
+ StreamSubscription<T> capture(void onData(T event)) =>
+ new _EventStreamSubscription<T>(
+ this._target, this._eventType, onData, true);
+}
+
+/**
+ * Adapter for exposing events on a collection of DOM Elements as streams,
+ * while also allowing event delegation.
+ */
+class _ElementListEventStreamImpl<T extends Event> extends Stream<T>
+ implements ElementStream<T> {
+ final Iterable<Element> _targetList;
+ final bool _useCapture;
+ final String _eventType;
+
+ _ElementListEventStreamImpl(
+ this._targetList, this._eventType, this._useCapture);
+
+ Stream<T> matches(String selector) => this.where(
+ (event) => event.target.matchesWithAncestors(selector)).map((e) {
+ e._selector = selector;
+ return e;
+ });
+
+ // Delegate all regular Stream behavior to a wrapped Stream.
+ StreamSubscription<T> listen(void onData(T event),
+ { Function onError,
+ void onDone(),
+ bool cancelOnError}) {
+ var pool = new _StreamPool.broadcast();
+ for (var target in _targetList) {
+ pool.add(new _EventStream(target, _eventType, _useCapture));
+ }
+ return pool.stream.listen(onData, onError: onError, onDone: onDone,
+ cancelOnError: cancelOnError);
+ }
+
+ StreamSubscription<T> capture(void onData(T event)) {
+ var pool = new _StreamPool.broadcast();
+ for (var target in _targetList) {
+ pool.add(new _EventStream(target, _eventType, true));
+ }
+ return pool.stream.listen(onData);
+ }
+
+ Stream<T> asBroadcastStream({void onListen(StreamSubscription<T> subscription),
+ void onCancel(StreamSubscription<T> subscription)})
+ => this;
+ bool get isBroadcast => true;
+}
+
+class _EventStreamSubscription<T extends Event> extends StreamSubscription<T> {
+ int _pauseCount = 0;
+ EventTarget _target;
+ final String _eventType;
+ var _onData;
+ final bool _useCapture;
+
+ _EventStreamSubscription(this._target, this._eventType, onData,
+ this._useCapture) : _onData = _wrapZone(onData) {
+ _tryResume();
+ }
+
+ Future cancel() {
+ if (_canceled) return null;
+
+ _unlisten();
+ // Clear out the target to indicate this is complete.
+ _target = null;
+ _onData = null;
+ return null;
+ }
+
+ bool get _canceled => _target == null;
+
+ void onData(void handleData(T event)) {
+ if (_canceled) {
+ throw new StateError("Subscription has been canceled.");
+ }
+ // Remove current event listener.
+ _unlisten();
+
+ _onData = _wrapZone(handleData);
+ _tryResume();
+ }
+
+ /// Has no effect.
+ void onError(Function handleError) {}
+
+ /// Has no effect.
+ void onDone(void handleDone()) {}
+
+ void pause([Future resumeSignal]) {
+ if (_canceled) return;
+ ++_pauseCount;
+ _unlisten();
+
+ if (resumeSignal != null) {
+ resumeSignal.whenComplete(resume);
+ }
+ }
+
+ bool get isPaused => _pauseCount > 0;
+
+ void resume() {
+ if (_canceled || !isPaused) return;
+ --_pauseCount;
+ _tryResume();
+ }
+
+ void _tryResume() {
+ if (_onData != null && !isPaused) {
+ _target.addEventListener(_eventType, _onData, _useCapture);
+ }
+ }
+
+ void _unlisten() {
+ if (_onData != null) {
+ _target.removeEventListener(_eventType, _onData, _useCapture);
+ }
+ }
+
+ Future asFuture([var futureValue]) {
+ // We just need a future that will never succeed or fail.
+ Completer completer = new Completer();
+ return completer.future;
+ }
+}
+
+/**
+ * A stream of custom events, which enables the user to "fire" (add) their own
+ * custom events to a stream.
+ */
+abstract class CustomStream<T extends Event> implements Stream<T> {
+ /**
+ * Add the following custom event to the stream for dispatching to interested
+ * listeners.
+ */
+ void add(T event);
+}
+
+class _CustomEventStreamImpl<T extends Event> extends Stream<T>
+ implements CustomStream<T> {
+ StreamController<T> _streamController;
+ /** The type of event this stream is providing (e.g. "keydown"). */
+ String _type;
+
+ _CustomEventStreamImpl(String type) {
+ _type = type;
+ _streamController = new StreamController.broadcast(sync: true);
+ }
+
+ // Delegate all regular Stream behavior to our wrapped Stream.
+ StreamSubscription<T> listen(void onData(T event),
+ { Function onError,
+ void onDone(),
+ bool cancelOnError}) {
+ return _streamController.stream.listen(onData, onError: onError,
+ onDone: onDone, cancelOnError: cancelOnError);
+ }
+
+ Stream<T> asBroadcastStream({void onListen(StreamSubscription<T> subscription),
+ void onCancel(StreamSubscription<T> subscription)})
+ => _streamController.stream;
+
+ bool get isBroadcast => true;
+
+ void add(T event) {
+ if (event.type == _type) _streamController.add(event);
+ }
+}
+
+class _CustomKeyEventStreamImpl extends _CustomEventStreamImpl<KeyEvent>
+ implements CustomStream<KeyEvent> {
+ _CustomKeyEventStreamImpl(String type) : super(type);
+
+ void add(KeyEvent event) {
+ if (event.type == _type) {
+ event.currentTarget.dispatchEvent(event._parent);
+ _streamController.add(event);
+ }
+ }
+}
+
+/**
+ * A pool of streams whose events are unified and emitted through a central
+ * stream.
+ */
+// TODO (efortuna): Remove this when Issue 12218 is addressed.
+class _StreamPool<T> {
+ StreamController<T> _controller;
+
+ /// Subscriptions to the streams that make up the pool.
+ var _subscriptions = new Map<Stream<T>, StreamSubscription<T>>();
+
+ /**
+ * Creates a new stream pool where [stream] can be listened to more than
+ * once.
+ *
+ * Any events from buffered streams in the pool will be emitted immediately,
+ * regardless of whether [stream] has any subscribers.
+ */
+ _StreamPool.broadcast() {
+ _controller = new StreamController<T>.broadcast(sync: true,
+ onCancel: close);
+ }
+
+ /**
+ * The stream through which all events from streams in the pool are emitted.
+ */
+ Stream<T> get stream => _controller.stream;
+
+ /**
+ * Adds [stream] as a member of this pool.
+ *
+ * Any events from [stream] will be emitted through [this.stream]. If
+ * [stream] is sync, they'll be emitted synchronously; if [stream] is async,
+ * they'll be emitted asynchronously.
+ */
+ void add(Stream<T> stream) {
+ if (_subscriptions.containsKey(stream)) return;
+ _subscriptions[stream] = stream.listen(_controller.add,
+ onError: _controller.addError,
+ onDone: () => remove(stream));
+ }
+
+ /** Removes [stream] as a member of this pool. */
+ void remove(Stream<T> stream) {
+ var subscription = _subscriptions.remove(stream);
+ if (subscription != null) subscription.cancel();
+ }
+
+ /** Removes all streams from this pool and closes [stream]. */
+ void close() {
+ for (var subscription in _subscriptions.values) {
+ subscription.cancel();
+ }
+ _subscriptions.clear();
+ _controller.close();
+ }
+}
+
+/**
+ * A factory to expose DOM events as streams, where the DOM event name has to
+ * be determined on the fly (for example, mouse wheel events).
+ */
+class _CustomEventStreamProvider<T extends Event>
+ implements EventStreamProvider<T> {
+
+ final _eventTypeGetter;
+ const _CustomEventStreamProvider(this._eventTypeGetter);
+
+ Stream<T> forTarget(EventTarget e, {bool useCapture: false}) {
+ return new _EventStream(e, _eventTypeGetter(e), useCapture);
+ }
+
+ ElementStream<T> forElement(Element e, {bool useCapture: false}) {
+ return new _ElementEventStreamImpl(e, _eventTypeGetter(e), useCapture);
+ }
+
+ ElementStream<T> _forElementList(ElementList e,
+ {bool useCapture: false}) {
+ return new _ElementListEventStreamImpl(e, _eventTypeGetter(e), useCapture);
+ }
+
+ String getEventType(EventTarget target) {
+ return _eventTypeGetter(target);
+ }
+
+ String get _eventType =>
+ throw new UnsupportedError('Access type through getEventType method.');
+}
+// DO NOT EDIT- this file is generated from running tool/generator.sh.
+
+// Copyright (c) 2013, 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.
+
+
+/**
+ * A Dart DOM validator generated from Caja whitelists.
+ *
+ * This contains a whitelist of known HTML tagNames and attributes and will only
+ * accept known good values.
+ *
+ * See also:
+ *
+ * * <https://code.google.com/p/google-caja/wiki/CajaWhitelists>
+ */
+class _Html5NodeValidator implements NodeValidator {
+
+ static final Set<String> _allowedElements = new Set.from([
+ 'A',
+ 'ABBR',
+ 'ACRONYM',
+ 'ADDRESS',
+ 'AREA',
+ 'ARTICLE',
+ 'ASIDE',
+ 'AUDIO',
+ 'B',
+ 'BDI',
+ 'BDO',
+ 'BIG',
+ 'BLOCKQUOTE',
+ 'BR',
+ 'BUTTON',
+ 'CANVAS',
+ 'CAPTION',
+ 'CENTER',
+ 'CITE',
+ 'CODE',
+ 'COL',
+ 'COLGROUP',
+ 'COMMAND',
+ 'DATA',
+ 'DATALIST',
+ 'DD',
+ 'DEL',
+ 'DETAILS',
+ 'DFN',
+ 'DIR',
+ 'DIV',
+ 'DL',
+ 'DT',
+ 'EM',
+ 'FIELDSET',
+ 'FIGCAPTION',
+ 'FIGURE',
+ 'FONT',
+ 'FOOTER',
+ 'FORM',
+ 'H1',
+ 'H2',
+ 'H3',
+ 'H4',
+ 'H5',
+ 'H6',
+ 'HEADER',
+ 'HGROUP',
+ 'HR',
+ 'I',
+ 'IFRAME',
+ 'IMG',
+ 'INPUT',
+ 'INS',
+ 'KBD',
+ 'LABEL',
+ 'LEGEND',
+ 'LI',
+ 'MAP',
+ 'MARK',
+ 'MENU',
+ 'METER',
+ 'NAV',
+ 'NOBR',
+ 'OL',
+ 'OPTGROUP',
+ 'OPTION',
+ 'OUTPUT',
+ 'P',
+ 'PRE',
+ 'PROGRESS',
+ 'Q',
+ 'S',
+ 'SAMP',
+ 'SECTION',
+ 'SELECT',
+ 'SMALL',
+ 'SOURCE',
+ 'SPAN',
+ 'STRIKE',
+ 'STRONG',
+ 'SUB',
+ 'SUMMARY',
+ 'SUP',
+ 'TABLE',
+ 'TBODY',
+ 'TD',
+ 'TEXTAREA',
+ 'TFOOT',
+ 'TH',
+ 'THEAD',
+ 'TIME',
+ 'TR',
+ 'TRACK',
+ 'TT',
+ 'U',
+ 'UL',
+ 'VAR',
+ 'VIDEO',
+ 'WBR',
+ ]);
+
+ static const _standardAttributes = const <String>[
+ '*::class',
+ '*::dir',
+ '*::draggable',
+ '*::hidden',
+ '*::id',
+ '*::inert',
+ '*::itemprop',
+ '*::itemref',
+ '*::itemscope',
+ '*::lang',
+ '*::spellcheck',
+ '*::title',
+ '*::translate',
+ 'A::accesskey',
+ 'A::coords',
+ 'A::hreflang',
+ 'A::name',
+ 'A::shape',
+ 'A::tabindex',
+ 'A::target',
+ 'A::type',
+ 'AREA::accesskey',
+ 'AREA::alt',
+ 'AREA::coords',
+ 'AREA::nohref',
+ 'AREA::shape',
+ 'AREA::tabindex',
+ 'AREA::target',
+ 'AUDIO::controls',
+ 'AUDIO::loop',
+ 'AUDIO::mediagroup',
+ 'AUDIO::muted',
+ 'AUDIO::preload',
+ 'BDO::dir',
+ 'BODY::alink',
+ 'BODY::bgcolor',
+ 'BODY::link',
+ 'BODY::text',
+ 'BODY::vlink',
+ 'BR::clear',
+ 'BUTTON::accesskey',
+ 'BUTTON::disabled',
+ 'BUTTON::name',
+ 'BUTTON::tabindex',
+ 'BUTTON::type',
+ 'BUTTON::value',
+ 'CANVAS::height',
+ 'CANVAS::width',
+ 'CAPTION::align',
+ 'COL::align',
+ 'COL::char',
+ 'COL::charoff',
+ 'COL::span',
+ 'COL::valign',
+ 'COL::width',
+ 'COLGROUP::align',
+ 'COLGROUP::char',
+ 'COLGROUP::charoff',
+ 'COLGROUP::span',
+ 'COLGROUP::valign',
+ 'COLGROUP::width',
+ 'COMMAND::checked',
+ 'COMMAND::command',
+ 'COMMAND::disabled',
+ 'COMMAND::label',
+ 'COMMAND::radiogroup',
+ 'COMMAND::type',
+ 'DATA::value',
+ 'DEL::datetime',
+ 'DETAILS::open',
+ 'DIR::compact',
+ 'DIV::align',
+ 'DL::compact',
+ 'FIELDSET::disabled',
+ 'FONT::color',
+ 'FONT::face',
+ 'FONT::size',
+ 'FORM::accept',
+ 'FORM::autocomplete',
+ 'FORM::enctype',
+ 'FORM::method',
+ 'FORM::name',
+ 'FORM::novalidate',
+ 'FORM::target',
+ 'FRAME::name',
+ 'H1::align',
+ 'H2::align',
+ 'H3::align',
+ 'H4::align',
+ 'H5::align',
+ 'H6::align',
+ 'HR::align',
+ 'HR::noshade',
+ 'HR::size',
+ 'HR::width',
+ 'HTML::version',
+ 'IFRAME::align',
+ 'IFRAME::frameborder',
+ 'IFRAME::height',
+ 'IFRAME::marginheight',
+ 'IFRAME::marginwidth',
+ 'IFRAME::width',
+ 'IMG::align',
+ 'IMG::alt',
+ 'IMG::border',
+ 'IMG::height',
+ 'IMG::hspace',
+ 'IMG::ismap',
+ 'IMG::name',
+ 'IMG::usemap',
+ 'IMG::vspace',
+ 'IMG::width',
+ 'INPUT::accept',
+ 'INPUT::accesskey',
+ 'INPUT::align',
+ 'INPUT::alt',
+ 'INPUT::autocomplete',
+ 'INPUT::checked',
+ 'INPUT::disabled',
+ 'INPUT::inputmode',
+ 'INPUT::ismap',
+ 'INPUT::list',
+ 'INPUT::max',
+ 'INPUT::maxlength',
+ 'INPUT::min',
+ 'INPUT::multiple',
+ 'INPUT::name',
+ 'INPUT::placeholder',
+ 'INPUT::readonly',
+ 'INPUT::required',
+ 'INPUT::size',
+ 'INPUT::step',
+ 'INPUT::tabindex',
+ 'INPUT::type',
+ 'INPUT::usemap',
+ 'INPUT::value',
+ 'INS::datetime',
+ 'KEYGEN::disabled',
+ 'KEYGEN::keytype',
+ 'KEYGEN::name',
+ 'LABEL::accesskey',
+ 'LABEL::for',
+ 'LEGEND::accesskey',
+ 'LEGEND::align',
+ 'LI::type',
+ 'LI::value',
+ 'LINK::sizes',
+ 'MAP::name',
+ 'MENU::compact',
+ 'MENU::label',
+ 'MENU::type',
+ 'METER::high',
+ 'METER::low',
+ 'METER::max',
+ 'METER::min',
+ 'METER::value',
+ 'OBJECT::typemustmatch',
+ 'OL::compact',
+ 'OL::reversed',
+ 'OL::start',
+ 'OL::type',
+ 'OPTGROUP::disabled',
+ 'OPTGROUP::label',
+ 'OPTION::disabled',
+ 'OPTION::label',
+ 'OPTION::selected',
+ 'OPTION::value',
+ 'OUTPUT::for',
+ 'OUTPUT::name',
+ 'P::align',
+ 'PRE::width',
+ 'PROGRESS::max',
+ 'PROGRESS::min',
+ 'PROGRESS::value',
+ 'SELECT::autocomplete',
+ 'SELECT::disabled',
+ 'SELECT::multiple',
+ 'SELECT::name',
+ 'SELECT::required',
+ 'SELECT::size',
+ 'SELECT::tabindex',
+ 'SOURCE::type',
+ 'TABLE::align',
+ 'TABLE::bgcolor',
+ 'TABLE::border',
+ 'TABLE::cellpadding',
+ 'TABLE::cellspacing',
+ 'TABLE::frame',
+ 'TABLE::rules',
+ 'TABLE::summary',
+ 'TABLE::width',
+ 'TBODY::align',
+ 'TBODY::char',
+ 'TBODY::charoff',
+ 'TBODY::valign',
+ 'TD::abbr',
+ 'TD::align',
+ 'TD::axis',
+ 'TD::bgcolor',
+ 'TD::char',
+ 'TD::charoff',
+ 'TD::colspan',
+ 'TD::headers',
+ 'TD::height',
+ 'TD::nowrap',
+ 'TD::rowspan',
+ 'TD::scope',
+ 'TD::valign',
+ 'TD::width',
+ 'TEXTAREA::accesskey',
+ 'TEXTAREA::autocomplete',
+ 'TEXTAREA::cols',
+ 'TEXTAREA::disabled',
+ 'TEXTAREA::inputmode',
+ 'TEXTAREA::name',
+ 'TEXTAREA::placeholder',
+ 'TEXTAREA::readonly',
+ 'TEXTAREA::required',
+ 'TEXTAREA::rows',
+ 'TEXTAREA::tabindex',
+ 'TEXTAREA::wrap',
+ 'TFOOT::align',
+ 'TFOOT::char',
+ 'TFOOT::charoff',
+ 'TFOOT::valign',
+ 'TH::abbr',
+ 'TH::align',
+ 'TH::axis',
+ 'TH::bgcolor',
+ 'TH::char',
+ 'TH::charoff',
+ 'TH::colspan',
+ 'TH::headers',
+ 'TH::height',
+ 'TH::nowrap',
+ 'TH::rowspan',
+ 'TH::scope',
+ 'TH::valign',
+ 'TH::width',
+ 'THEAD::align',
+ 'THEAD::char',
+ 'THEAD::charoff',
+ 'THEAD::valign',
+ 'TR::align',
+ 'TR::bgcolor',
+ 'TR::char',
+ 'TR::charoff',
+ 'TR::valign',
+ 'TRACK::default',
+ 'TRACK::kind',
+ 'TRACK::label',
+ 'TRACK::srclang',
+ 'UL::compact',
+ 'UL::type',
+ 'VIDEO::controls',
+ 'VIDEO::height',
+ 'VIDEO::loop',
+ 'VIDEO::mediagroup',
+ 'VIDEO::muted',
+ 'VIDEO::preload',
+ 'VIDEO::width',
+ ];
+
+ static const _uriAttributes = const <String>[
+ 'A::href',
+ 'AREA::href',
+ 'BLOCKQUOTE::cite',
+ 'BODY::background',
+ 'COMMAND::icon',
+ 'DEL::cite',
+ 'FORM::action',
+ 'IMG::src',
+ 'INPUT::src',
+ 'INS::cite',
+ 'Q::cite',
+ 'VIDEO::poster',
+ ];
+
+ final UriPolicy uriPolicy;
+
+ static final Map<String, Function> _attributeValidators = {};
+
+ /**
+ * All known URI attributes will be validated against the UriPolicy, if
+ * [uriPolicy] is null then a default UriPolicy will be used.
+ */
+ _Html5NodeValidator({UriPolicy uriPolicy})
+ :uriPolicy = uriPolicy != null ? uriPolicy : new UriPolicy() {
+
+ if (_attributeValidators.isEmpty) {
+ for (var attr in _standardAttributes) {
+ _attributeValidators[attr] = _standardAttributeValidator;
+ }
+
+ for (var attr in _uriAttributes) {
+ _attributeValidators[attr] = _uriAttributeValidator;
+ }
+ }
+ }
+
+ bool allowsElement(Element element) {
+ return _allowedElements.contains(Element._safeTagName(element));
+ }
+
+ bool allowsAttribute(Element element, String attributeName, String value) {
+ var tagName = Element._safeTagName(element);
+ var validator = _attributeValidators['$tagName::$attributeName'];
+ if (validator == null) {
+ validator = _attributeValidators['*::$attributeName'];
+ }
+ if (validator == null) {
+ return false;
+ }
+ return validator(element, attributeName, value, this);
+ }
+
+ static bool _standardAttributeValidator(Element element, String attributeName,
+ String value, _Html5NodeValidator context) {
+ return true;
+ }
+
+ static bool _uriAttributeValidator(Element element, String attributeName,
+ String value, _Html5NodeValidator context) {
+ return context.uriPolicy.allowsUri(value);
+ }
+}
+// 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.
+
+
+abstract class ImmutableListMixin<E> implements List<E> {
+ // From Iterable<$E>:
+ Iterator<E> get iterator {
+ // Note: NodeLists are not fixed size. And most probably length shouldn't
+ // be cached in both iterator _and_ forEach method. For now caching it
+ // for consistency.
+ return new FixedSizeListIterator<E>(this);
+ }
+
+ // From Collection<E>:
+ void add(E value) {
+ throw new UnsupportedError("Cannot add to immutable List.");
+ }
+
+ void addAll(Iterable<E> iterable) {
+ throw new UnsupportedError("Cannot add to immutable List.");
+ }
+
+ // From List<E>:
+ void sort([int compare(E a, E b)]) {
+ throw new UnsupportedError("Cannot sort immutable List.");
+ }
+
+ void shuffle([Random random]) {
+ throw new UnsupportedError("Cannot shuffle immutable List.");
+ }
+
+ void insert(int index, E element) {
+ throw new UnsupportedError("Cannot add to immutable List.");
+ }
+
+ void insertAll(int index, Iterable<E> iterable) {
+ throw new UnsupportedError("Cannot add to immutable List.");
+ }
+
+ void setAll(int index, Iterable<E> iterable) {
+ throw new UnsupportedError("Cannot modify an immutable List.");
+ }
+
+ E removeAt(int pos) {
+ throw new UnsupportedError("Cannot remove from immutable List.");
+ }
+
+ E removeLast() {
+ throw new UnsupportedError("Cannot remove from immutable List.");
+ }
+
+ bool remove(Object object) {
+ throw new UnsupportedError("Cannot remove from immutable List.");
+ }
+
+ void removeWhere(bool test(E element)) {
+ throw new UnsupportedError("Cannot remove from immutable List.");
+ }
+
+ void retainWhere(bool test(E element)) {
+ throw new UnsupportedError("Cannot remove from immutable List.");
+ }
+
+ void setRange(int start, int end, Iterable<E> iterable, [int skipCount = 0]) {
+ throw new UnsupportedError("Cannot setRange on immutable List.");
+ }
+
+ void removeRange(int start, int end) {
+ throw new UnsupportedError("Cannot removeRange on immutable List.");
+ }
+
+ void replaceRange(int start, int end, Iterable<E> iterable) {
+ throw new UnsupportedError("Cannot modify an immutable List.");
+ }
+
+ void fillRange(int start, int end, [E fillValue]) {
+ throw new UnsupportedError("Cannot modify an immutable List.");
+ }
+}
+// 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.
+
+
+/**
+ * Defines the keycode values for keys that are returned by
+ * KeyboardEvent.keyCode.
+ *
+ * Important note: There is substantial divergence in how different browsers
+ * handle keycodes and their variants in different locales/keyboard layouts. We
+ * provide these constants to help make code processing keys more readable.
+ */
+abstract class KeyCode {
+ // These constant names were borrowed from Closure's Keycode enumeration
+ // class.
+ // http://closure-library.googlecode.com/svn/docs/closure_goog_events_keycodes.js.source.html
+ static const int WIN_KEY_FF_LINUX = 0;
+ static const int MAC_ENTER = 3;
+ static const int BACKSPACE = 8;
+ static const int TAB = 9;
+ /** NUM_CENTER is also NUMLOCK for FF and Safari on Mac. */
+ static const int NUM_CENTER = 12;
+ static const int ENTER = 13;
+ static const int SHIFT = 16;
+ static const int CTRL = 17;
+ static const int ALT = 18;
+ static const int PAUSE = 19;
+ static const int CAPS_LOCK = 20;
+ static const int ESC = 27;
+ static const int SPACE = 32;
+ static const int PAGE_UP = 33;
+ static const int PAGE_DOWN = 34;
+ static const int END = 35;
+ static const int HOME = 36;
+ static const int LEFT = 37;
+ static const int UP = 38;
+ static const int RIGHT = 39;
+ static const int DOWN = 40;
+ static const int NUM_NORTH_EAST = 33;
+ static const int NUM_SOUTH_EAST = 34;
+ static const int NUM_SOUTH_WEST = 35;
+ static const int NUM_NORTH_WEST = 36;
+ static const int NUM_WEST = 37;
+ static const int NUM_NORTH = 38;
+ static const int NUM_EAST = 39;
+ static const int NUM_SOUTH = 40;
+ static const int PRINT_SCREEN = 44;
+ static const int INSERT = 45;
+ static const int NUM_INSERT = 45;
+ static const int DELETE = 46;
+ static const int NUM_DELETE = 46;
+ static const int ZERO = 48;
+ static const int ONE = 49;
+ static const int TWO = 50;
+ static const int THREE = 51;
+ static const int FOUR = 52;
+ static const int FIVE = 53;
+ static const int SIX = 54;
+ static const int SEVEN = 55;
+ static const int EIGHT = 56;
+ static const int NINE = 57;
+ static const int FF_SEMICOLON = 59;
+ static const int FF_EQUALS = 61;
+ /**
+ * CAUTION: The question mark is for US-keyboard layouts. It varies
+ * for other locales and keyboard layouts.
+ */
+ static const int QUESTION_MARK = 63;
+ static const int A = 65;
+ static const int B = 66;
+ static const int C = 67;
+ static const int D = 68;
+ static const int E = 69;
+ static const int F = 70;
+ static const int G = 71;
+ static const int H = 72;
+ static const int I = 73;
+ static const int J = 74;
+ static const int K = 75;
+ static const int L = 76;
+ static const int M = 77;
+ static const int N = 78;
+ static const int O = 79;
+ static const int P = 80;
+ static const int Q = 81;
+ static const int R = 82;
+ static const int S = 83;
+ static const int T = 84;
+ static const int U = 85;
+ static const int V = 86;
+ static const int W = 87;
+ static const int X = 88;
+ static const int Y = 89;
+ static const int Z = 90;
+ static const int META = 91;
+ static const int WIN_KEY_LEFT = 91;
+ static const int WIN_KEY_RIGHT = 92;
+ static const int CONTEXT_MENU = 93;
+ static const int NUM_ZERO = 96;
+ static const int NUM_ONE = 97;
+ static const int NUM_TWO = 98;
+ static const int NUM_THREE = 99;
+ static const int NUM_FOUR = 100;
+ static const int NUM_FIVE = 101;
+ static const int NUM_SIX = 102;
+ static const int NUM_SEVEN = 103;
+ static const int NUM_EIGHT = 104;
+ static const int NUM_NINE = 105;
+ static const int NUM_MULTIPLY = 106;
+ static const int NUM_PLUS = 107;
+ static const int NUM_MINUS = 109;
+ static const int NUM_PERIOD = 110;
+ static const int NUM_DIVISION = 111;
+ static const int F1 = 112;
+ static const int F2 = 113;
+ static const int F3 = 114;
+ static const int F4 = 115;
+ static const int F5 = 116;
+ static const int F6 = 117;
+ static const int F7 = 118;
+ static const int F8 = 119;
+ static const int F9 = 120;
+ static const int F10 = 121;
+ static const int F11 = 122;
+ static const int F12 = 123;
+ static const int NUMLOCK = 144;
+ static const int SCROLL_LOCK = 145;
+
+ // OS-specific media keys like volume controls and browser controls.
+ static const int FIRST_MEDIA_KEY = 166;
+ static const int LAST_MEDIA_KEY = 183;
+
+ /**
+ * CAUTION: This constant requires localization for other locales and keyboard
+ * layouts.
+ */
+ static const int SEMICOLON = 186;
+ /**
+ * CAUTION: This constant requires localization for other locales and keyboard
+ * layouts.
+ */
+ static const int DASH = 189;
+ /**
+ * CAUTION: This constant requires localization for other locales and keyboard
+ * layouts.
+ */
+ static const int EQUALS = 187;
+ /**
+ * CAUTION: This constant requires localization for other locales and keyboard
+ * layouts.
+ */
+ static const int COMMA = 188;
+ /**
+ * CAUTION: This constant requires localization for other locales and keyboard
+ * layouts.
+ */
+ static const int PERIOD = 190;
+ /**
+ * CAUTION: This constant requires localization for other locales and keyboard
+ * layouts.
+ */
+ static const int SLASH = 191;
+ /**
+ * CAUTION: This constant requires localization for other locales and keyboard
+ * layouts.
+ */
+ static const int APOSTROPHE = 192;
+ /**
+ * CAUTION: This constant requires localization for other locales and keyboard
+ * layouts.
+ */
+ static const int TILDE = 192;
+ /**
+ * CAUTION: This constant requires localization for other locales and keyboard
+ * layouts.
+ */
+ static const int SINGLE_QUOTE = 222;
+ /**
+ * CAUTION: This constant requires localization for other locales and keyboard
+ * layouts.
+ */
+ static const int OPEN_SQUARE_BRACKET = 219;
+ /**
+ * CAUTION: This constant requires localization for other locales and keyboard
+ * layouts.
+ */
+ static const int BACKSLASH = 220;
+ /**
+ * CAUTION: This constant requires localization for other locales and keyboard
+ * layouts.
+ */
+ static const int CLOSE_SQUARE_BRACKET = 221;
+ static const int WIN_KEY = 224;
+ static const int MAC_FF_META = 224;
+ static const int WIN_IME = 229;
+
+ /** A sentinel value if the keycode could not be determined. */
+ static const int UNKNOWN = -1;
+
+ /**
+ * Returns true if the keyCode produces a (US keyboard) character.
+ * Note: This does not (yet) cover characters on non-US keyboards (Russian,
+ * Hebrew, etc.).
+ */
+ static bool isCharacterKey(int keyCode) {
+ if ((keyCode >= ZERO && keyCode <= NINE) ||
+ (keyCode >= NUM_ZERO && keyCode <= NUM_MULTIPLY) ||
+ (keyCode >= A && keyCode <= Z)) {
+ return true;
+ }
+
+ // Safari sends zero key code for non-latin characters.
+ if (Device.isWebKit && keyCode == 0) {
+ return true;
+ }
+
+ return (keyCode == SPACE || keyCode == QUESTION_MARK || keyCode == NUM_PLUS
+ || keyCode == NUM_MINUS || keyCode == NUM_PERIOD ||
+ keyCode == NUM_DIVISION || keyCode == SEMICOLON ||
+ keyCode == FF_SEMICOLON || keyCode == DASH || keyCode == EQUALS ||
+ keyCode == FF_EQUALS || keyCode == COMMA || keyCode == PERIOD ||
+ keyCode == SLASH || keyCode == APOSTROPHE || keyCode == SINGLE_QUOTE ||
+ keyCode == OPEN_SQUARE_BRACKET || keyCode == BACKSLASH ||
+ keyCode == CLOSE_SQUARE_BRACKET);
+ }
+
+ /**
+ * Experimental helper function for converting keyCodes to keyNames for the
+ * keyIdentifier attribute still used in browsers not updated with current
+ * spec. This is an imperfect conversion! It will need to be refined, but
+ * hopefully it can just completely go away once all the browsers update to
+ * follow the DOM3 spec.
+ */
+ static String _convertKeyCodeToKeyName(int keyCode) {
+ switch(keyCode) {
+ case KeyCode.ALT: return _KeyName.ALT;
+ case KeyCode.BACKSPACE: return _KeyName.BACKSPACE;
+ case KeyCode.CAPS_LOCK: return _KeyName.CAPS_LOCK;
+ case KeyCode.CTRL: return _KeyName.CONTROL;
+ case KeyCode.DELETE: return _KeyName.DEL;
+ case KeyCode.DOWN: return _KeyName.DOWN;
+ case KeyCode.END: return _KeyName.END;
+ case KeyCode.ENTER: return _KeyName.ENTER;
+ case KeyCode.ESC: return _KeyName.ESC;
+ case KeyCode.F1: return _KeyName.F1;
+ case KeyCode.F2: return _KeyName.F2;
+ case KeyCode.F3: return _KeyName.F3;
+ case KeyCode.F4: return _KeyName.F4;
+ case KeyCode.F5: return _KeyName.F5;
+ case KeyCode.F6: return _KeyName.F6;
+ case KeyCode.F7: return _KeyName.F7;
+ case KeyCode.F8: return _KeyName.F8;
+ case KeyCode.F9: return _KeyName.F9;
+ case KeyCode.F10: return _KeyName.F10;
+ case KeyCode.F11: return _KeyName.F11;
+ case KeyCode.F12: return _KeyName.F12;
+ case KeyCode.HOME: return _KeyName.HOME;
+ case KeyCode.INSERT: return _KeyName.INSERT;
+ case KeyCode.LEFT: return _KeyName.LEFT;
+ case KeyCode.META: return _KeyName.META;
+ case KeyCode.NUMLOCK: return _KeyName.NUM_LOCK;
+ case KeyCode.PAGE_DOWN: return _KeyName.PAGE_DOWN;
+ case KeyCode.PAGE_UP: return _KeyName.PAGE_UP;
+ case KeyCode.PAUSE: return _KeyName.PAUSE;
+ case KeyCode.PRINT_SCREEN: return _KeyName.PRINT_SCREEN;
+ case KeyCode.RIGHT: return _KeyName.RIGHT;
+ case KeyCode.SCROLL_LOCK: return _KeyName.SCROLL;
+ case KeyCode.SHIFT: return _KeyName.SHIFT;
+ case KeyCode.SPACE: return _KeyName.SPACEBAR;
+ case KeyCode.TAB: return _KeyName.TAB;
+ case KeyCode.UP: return _KeyName.UP;
+ case KeyCode.WIN_IME:
+ case KeyCode.WIN_KEY:
+ case KeyCode.WIN_KEY_LEFT:
+ case KeyCode.WIN_KEY_RIGHT:
+ return _KeyName.WIN;
+ default: return _KeyName.UNIDENTIFIED;
+ }
+ return _KeyName.UNIDENTIFIED;
+ }
+}
+// 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.
+
+
+/**
+ * Defines the standard key locations returned by
+ * KeyboardEvent.getKeyLocation.
+ */
+abstract class KeyLocation {
+
+ /**
+ * The event key is not distinguished as the left or right version
+ * of the key, and did not originate from the numeric keypad (or did not
+ * originate with a virtual key corresponding to the numeric keypad).
+ */
+ static const int STANDARD = 0;
+
+ /**
+ * The event key is in the left key location.
+ */
+ static const int LEFT = 1;
+
+ /**
+ * The event key is in the right key location.
+ */
+ static const int RIGHT = 2;
+
+ /**
+ * The event key originated on the numeric keypad or with a virtual key
+ * corresponding to the numeric keypad.
+ */
+ static const int NUMPAD = 3;
+
+ /**
+ * The event key originated on a mobile device, either on a physical
+ * keypad or a virtual keyboard.
+ */
+ static const int MOBILE = 4;
+
+ /**
+ * The event key originated on a game controller or a joystick on a mobile
+ * device.
+ */
+ static const int JOYSTICK = 5;
+}
+// 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.
+
+
+/**
+ * Defines the standard keyboard identifier names for keys that are returned
+ * by KeyboardEvent.getKeyboardIdentifier when the key does not have a direct
+ * unicode mapping.
+ */
+abstract class _KeyName {
+
+ /** The Accept (Commit, OK) key */
+ static const String ACCEPT = "Accept";
+
+ /** The Add key */
+ static const String ADD = "Add";
+
+ /** The Again key */
+ static const String AGAIN = "Again";
+
+ /** The All Candidates key */
+ static const String ALL_CANDIDATES = "AllCandidates";
+
+ /** The Alphanumeric key */
+ static const String ALPHANUMERIC = "Alphanumeric";
+
+ /** The Alt (Menu) key */
+ static const String ALT = "Alt";
+
+ /** The Alt-Graph key */
+ static const String ALT_GRAPH = "AltGraph";
+
+ /** The Application key */
+ static const String APPS = "Apps";
+
+ /** The ATTN key */
+ static const String ATTN = "Attn";
+
+ /** The Browser Back key */
+ static const String BROWSER_BACK = "BrowserBack";
+
+ /** The Browser Favorites key */
+ static const String BROWSER_FAVORTIES = "BrowserFavorites";
+
+ /** The Browser Forward key */
+ static const String BROWSER_FORWARD = "BrowserForward";
+
+ /** The Browser Home key */
+ static const String BROWSER_NAME = "BrowserHome";
+
+ /** The Browser Refresh key */
+ static const String BROWSER_REFRESH = "BrowserRefresh";
+
+ /** The Browser Search key */
+ static const String BROWSER_SEARCH = "BrowserSearch";
+
+ /** The Browser Stop key */
+ static const String BROWSER_STOP = "BrowserStop";
+
+ /** The Camera key */
+ static const String CAMERA = "Camera";
+
+ /** The Caps Lock (Capital) key */
+ static const String CAPS_LOCK = "CapsLock";
+
+ /** The Clear key */
+ static const String CLEAR = "Clear";
+
+ /** The Code Input key */
+ static const String CODE_INPUT = "CodeInput";
+
+ /** The Compose key */
+ static const String COMPOSE = "Compose";
+
+ /** The Control (Ctrl) key */
+ static const String CONTROL = "Control";
+
+ /** The Crsel key */
+ static const String CRSEL = "Crsel";
+
+ /** The Convert key */
+ static const String CONVERT = "Convert";
+
+ /** The Copy key */
+ static const String COPY = "Copy";
+
+ /** The Cut key */
+ static const String CUT = "Cut";
+
+ /** The Decimal key */
+ static const String DECIMAL = "Decimal";
+
+ /** The Divide key */
+ static const String DIVIDE = "Divide";
+
+ /** The Down Arrow key */
+ static const String DOWN = "Down";
+
+ /** The diagonal Down-Left Arrow key */
+ static const String DOWN_LEFT = "DownLeft";
+
+ /** The diagonal Down-Right Arrow key */
+ static const String DOWN_RIGHT = "DownRight";
+
+ /** The Eject key */
+ static const String EJECT = "Eject";
+
+ /** The End key */
+ static const String END = "End";
+
+ /**
+ * The Enter key. Note: This key value must also be used for the Return
+ * (Macintosh numpad) key
+ */
+ static const String ENTER = "Enter";
+
+ /** The Erase EOF key */
+ static const String ERASE_EOF= "EraseEof";
+
+ /** The Execute key */
+ static const String EXECUTE = "Execute";
+
+ /** The Exsel key */
+ static const String EXSEL = "Exsel";
+
+ /** The Function switch key */
+ static const String FN = "Fn";
+
+ /** The F1 key */
+ static const String F1 = "F1";
+
+ /** The F2 key */
+ static const String F2 = "F2";
+
+ /** The F3 key */
+ static const String F3 = "F3";
+
+ /** The F4 key */
+ static const String F4 = "F4";
+
+ /** The F5 key */
+ static const String F5 = "F5";
+
+ /** The F6 key */
+ static const String F6 = "F6";
+
+ /** The F7 key */
+ static const String F7 = "F7";
+
+ /** The F8 key */
+ static const String F8 = "F8";
+
+ /** The F9 key */
+ static const String F9 = "F9";
+
+ /** The F10 key */
+ static const String F10 = "F10";
+
+ /** The F11 key */
+ static const String F11 = "F11";
+
+ /** The F12 key */
+ static const String F12 = "F12";
+
+ /** The F13 key */
+ static const String F13 = "F13";
+
+ /** The F14 key */
+ static const String F14 = "F14";
+
+ /** The F15 key */
+ static const String F15 = "F15";
+
+ /** The F16 key */
+ static const String F16 = "F16";
+
+ /** The F17 key */
+ static const String F17 = "F17";
+
+ /** The F18 key */
+ static const String F18 = "F18";
+
+ /** The F19 key */
+ static const String F19 = "F19";
+
+ /** The F20 key */
+ static const String F20 = "F20";
+
+ /** The F21 key */
+ static const String F21 = "F21";
+
+ /** The F22 key */
+ static const String F22 = "F22";
+
+ /** The F23 key */
+ static const String F23 = "F23";
+
+ /** The F24 key */
+ static const String F24 = "F24";
+
+ /** The Final Mode (Final) key used on some asian keyboards */
+ static const String FINAL_MODE = "FinalMode";
+
+ /** The Find key */
+ static const String FIND = "Find";
+
+ /** The Full-Width Characters key */
+ static const String FULL_WIDTH = "FullWidth";
+
+ /** The Half-Width Characters key */
+ static const String HALF_WIDTH = "HalfWidth";
+
+ /** The Hangul (Korean characters) Mode key */
+ static const String HANGUL_MODE = "HangulMode";
+
+ /** The Hanja (Korean characters) Mode key */
+ static const String HANJA_MODE = "HanjaMode";
+
+ /** The Help key */
+ static const String HELP = "Help";
+
+ /** The Hiragana (Japanese Kana characters) key */
+ static const String HIRAGANA = "Hiragana";
+
+ /** The Home key */
+ static const String HOME = "Home";
+
+ /** The Insert (Ins) key */
+ static const String INSERT = "Insert";
+
+ /** The Japanese-Hiragana key */
+ static const String JAPANESE_HIRAGANA = "JapaneseHiragana";
+
+ /** The Japanese-Katakana key */
+ static const String JAPANESE_KATAKANA = "JapaneseKatakana";
+
+ /** The Japanese-Romaji key */
+ static const String JAPANESE_ROMAJI = "JapaneseRomaji";
+
+ /** The Junja Mode key */
+ static const String JUNJA_MODE = "JunjaMode";
+
+ /** The Kana Mode (Kana Lock) key */
+ static const String KANA_MODE = "KanaMode";
+
+ /**
+ * The Kanji (Japanese name for ideographic characters of Chinese origin)
+ * Mode key
+ */
+ static const String KANJI_MODE = "KanjiMode";
+
+ /** The Katakana (Japanese Kana characters) key */
+ static const String KATAKANA = "Katakana";
+
+ /** The Start Application One key */
+ static const String LAUNCH_APPLICATION_1 = "LaunchApplication1";
+
+ /** The Start Application Two key */
+ static const String LAUNCH_APPLICATION_2 = "LaunchApplication2";
+
+ /** The Start Mail key */
+ static const String LAUNCH_MAIL = "LaunchMail";
+
+ /** The Left Arrow key */
+ static const String LEFT = "Left";
+
+ /** The Menu key */
+ static const String MENU = "Menu";
+
+ /**
+ * The Meta key. Note: This key value shall be also used for the Apple
+ * Command key
+ */
+ static const String META = "Meta";
+
+ /** The Media Next Track key */
+ static const String MEDIA_NEXT_TRACK = "MediaNextTrack";
+
+ /** The Media Play Pause key */
+ static const String MEDIA_PAUSE_PLAY = "MediaPlayPause";
+
+ /** The Media Previous Track key */
+ static const String MEDIA_PREVIOUS_TRACK = "MediaPreviousTrack";
+
+ /** The Media Stop key */
+ static const String MEDIA_STOP = "MediaStop";
+
+ /** The Mode Change key */
+ static const String MODE_CHANGE = "ModeChange";
+
+ /** The Next Candidate function key */
+ static const String NEXT_CANDIDATE = "NextCandidate";
+
+ /** The Nonconvert (Don't Convert) key */
+ static const String NON_CONVERT = "Nonconvert";
+
+ /** The Number Lock key */
+ static const String NUM_LOCK = "NumLock";
+
+ /** The Page Down (Next) key */
+ static const String PAGE_DOWN = "PageDown";
+
+ /** The Page Up key */
+ static const String PAGE_UP = "PageUp";
+
+ /** The Paste key */
+ static const String PASTE = "Paste";
+
+ /** The Pause key */
+ static const String PAUSE = "Pause";
+
+ /** The Play key */
+ static const String PLAY = "Play";
+
+ /**
+ * The Power key. Note: Some devices may not expose this key to the
+ * operating environment
+ */
+ static const String POWER = "Power";
+
+ /** The Previous Candidate function key */
+ static const String PREVIOUS_CANDIDATE = "PreviousCandidate";
+
+ /** The Print Screen (PrintScrn, SnapShot) key */
+ static const String PRINT_SCREEN = "PrintScreen";
+
+ /** The Process key */
+ static const String PROCESS = "Process";
+
+ /** The Props key */
+ static const String PROPS = "Props";
+
+ /** The Right Arrow key */
+ static const String RIGHT = "Right";
+
+ /** The Roman Characters function key */
+ static const String ROMAN_CHARACTERS = "RomanCharacters";
+
+ /** The Scroll Lock key */
+ static const String SCROLL = "Scroll";
+
+ /** The Select key */
+ static const String SELECT = "Select";
+
+ /** The Select Media key */
+ static const String SELECT_MEDIA = "SelectMedia";
+
+ /** The Separator key */
+ static const String SEPARATOR = "Separator";
+
+ /** The Shift key */
+ static const String SHIFT = "Shift";
+
+ /** The Soft1 key */
+ static const String SOFT_1 = "Soft1";
+
+ /** The Soft2 key */
+ static const String SOFT_2 = "Soft2";
+
+ /** The Soft3 key */
+ static const String SOFT_3 = "Soft3";
+
+ /** The Soft4 key */
+ static const String SOFT_4 = "Soft4";
+
+ /** The Stop key */
+ static const String STOP = "Stop";
+
+ /** The Subtract key */
+ static const String SUBTRACT = "Subtract";
+
+ /** The Symbol Lock key */
+ static const String SYMBOL_LOCK = "SymbolLock";
+
+ /** The Up Arrow key */
+ static const String UP = "Up";
+
+ /** The diagonal Up-Left Arrow key */
+ static const String UP_LEFT = "UpLeft";
+
+ /** The diagonal Up-Right Arrow key */
+ static const String UP_RIGHT = "UpRight";
+
+ /** The Undo key */
+ static const String UNDO = "Undo";
+
+ /** The Volume Down key */
+ static const String VOLUME_DOWN = "VolumeDown";
+
+ /** The Volume Mute key */
+ static const String VOLUMN_MUTE = "VolumeMute";
+
+ /** The Volume Up key */
+ static const String VOLUMN_UP = "VolumeUp";
+
+ /** The Windows Logo key */
+ static const String WIN = "Win";
+
+ /** The Zoom key */
+ static const String ZOOM = "Zoom";
+
+ /**
+ * The Backspace (Back) key. Note: This key value shall be also used for the
+ * key labeled 'delete' MacOS keyboards when not modified by the 'Fn' key
+ */
+ static const String BACKSPACE = "Backspace";
+
+ /** The Horizontal Tabulation (Tab) key */
+ static const String TAB = "Tab";
+
+ /** The Cancel key */
+ static const String CANCEL = "Cancel";
+
+ /** The Escape (Esc) key */
+ static const String ESC = "Esc";
+
+ /** The Space (Spacebar) key: */
+ static const String SPACEBAR = "Spacebar";
+
+ /**
+ * The Delete (Del) Key. Note: This key value shall be also used for the key
+ * labeled 'delete' MacOS keyboards when modified by the 'Fn' key
+ */
+ static const String DEL = "Del";
+
+ /** The Combining Grave Accent (Greek Varia, Dead Grave) key */
+ static const String DEAD_GRAVE = "DeadGrave";
+
+ /**
+ * The Combining Acute Accent (Stress Mark, Greek Oxia, Tonos, Dead Eacute)
+ * key
+ */
+ static const String DEAD_EACUTE = "DeadEacute";
+
+ /** The Combining Circumflex Accent (Hat, Dead Circumflex) key */
+ static const String DEAD_CIRCUMFLEX = "DeadCircumflex";
+
+ /** The Combining Tilde (Dead Tilde) key */
+ static const String DEAD_TILDE = "DeadTilde";
+
+ /** The Combining Macron (Long, Dead Macron) key */
+ static const String DEAD_MACRON = "DeadMacron";
+
+ /** The Combining Breve (Short, Dead Breve) key */
+ static const String DEAD_BREVE = "DeadBreve";
+
+ /** The Combining Dot Above (Derivative, Dead Above Dot) key */
+ static const String DEAD_ABOVE_DOT = "DeadAboveDot";
+
+ /**
+ * The Combining Diaeresis (Double Dot Abode, Umlaut, Greek Dialytika,
+ * Double Derivative, Dead Diaeresis) key
+ */
+ static const String DEAD_UMLAUT = "DeadUmlaut";
+
+ /** The Combining Ring Above (Dead Above Ring) key */
+ static const String DEAD_ABOVE_RING = "DeadAboveRing";
+
+ /** The Combining Double Acute Accent (Dead Doubleacute) key */
+ static const String DEAD_DOUBLEACUTE = "DeadDoubleacute";
+
+ /** The Combining Caron (Hacek, V Above, Dead Caron) key */
+ static const String DEAD_CARON = "DeadCaron";
+
+ /** The Combining Cedilla (Dead Cedilla) key */
+ static const String DEAD_CEDILLA = "DeadCedilla";
+
+ /** The Combining Ogonek (Nasal Hook, Dead Ogonek) key */
+ static const String DEAD_OGONEK = "DeadOgonek";
+
+ /**
+ * The Combining Greek Ypogegrammeni (Greek Non-Spacing Iota Below, Iota
+ * Subscript, Dead Iota) key
+ */
+ static const String DEAD_IOTA = "DeadIota";
+
+ /**
+ * The Combining Katakana-Hiragana Voiced Sound Mark (Dead Voiced Sound) key
+ */
+ static const String DEAD_VOICED_SOUND = "DeadVoicedSound";
+
+ /**
+ * The Combining Katakana-Hiragana Semi-Voiced Sound Mark (Dead Semivoiced
+ * Sound) key
+ */
+ static const String DEC_SEMIVOICED_SOUND= "DeadSemivoicedSound";
+
+ /**
+ * Key value used when an implementation is unable to identify another key
+ * value, due to either hardware, platform, or software constraints
+ */
+ static const String UNIDENTIFIED = "Unidentified";
+}
+// 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.
+
+
+/**
+ * Internal class that does the actual calculations to determine keyCode and
+ * charCode for keydown, keypress, and keyup events for all browsers.
+ */
+class _KeyboardEventHandler extends EventStreamProvider<KeyEvent> {
+ // This code inspired by Closure's KeyHandling library.
+ // http://closure-library.googlecode.com/svn/docs/closure_goog_events_keyhandler.js.source.html
+
+ /**
+ * The set of keys that have been pressed down without seeing their
+ * corresponding keyup event.
+ */
+ final List<KeyEvent> _keyDownList = <KeyEvent>[];
+
+ /** The type of KeyEvent we are tracking (keyup, keydown, keypress). */
+ final String _type;
+
+ /** The element we are watching for events to happen on. */
+ final EventTarget _target;
+
+ // The distance to shift from upper case alphabet Roman letters to lower case.
+ static final int _ROMAN_ALPHABET_OFFSET = "a".codeUnits[0] - "A".codeUnits[0];
+
+ /** Custom Stream (Controller) to produce KeyEvents for the stream. */
+ _CustomKeyEventStreamImpl _stream;
+
+ static const _EVENT_TYPE = 'KeyEvent';
+
+ /**
+ * An enumeration of key identifiers currently part of the W3C draft for DOM3
+ * and their mappings to keyCodes.
+ * http://www.w3.org/TR/DOM-Level-3-Events/keyset.html#KeySet-Set
+ */
+ static const Map<String, int> _keyIdentifier = const {
+ 'Up': KeyCode.UP,
+ 'Down': KeyCode.DOWN,
+ 'Left': KeyCode.LEFT,
+ 'Right': KeyCode.RIGHT,
+ 'Enter': KeyCode.ENTER,
+ 'F1': KeyCode.F1,
+ 'F2': KeyCode.F2,
+ 'F3': KeyCode.F3,
+ 'F4': KeyCode.F4,
+ 'F5': KeyCode.F5,
+ 'F6': KeyCode.F6,
+ 'F7': KeyCode.F7,
+ 'F8': KeyCode.F8,
+ 'F9': KeyCode.F9,
+ 'F10': KeyCode.F10,
+ 'F11': KeyCode.F11,
+ 'F12': KeyCode.F12,
+ 'U+007F': KeyCode.DELETE,
+ 'Home': KeyCode.HOME,
+ 'End': KeyCode.END,
+ 'PageUp': KeyCode.PAGE_UP,
+ 'PageDown': KeyCode.PAGE_DOWN,
+ 'Insert': KeyCode.INSERT
+ };
+
+ /** Return a stream for KeyEvents for the specified target. */
+ // Note: this actually functions like a factory constructor.
+ CustomStream<KeyEvent> forTarget(EventTarget e, {bool useCapture: false}) {
+ var handler = new _KeyboardEventHandler.initializeAllEventListeners(
+ _type, e);
+ return handler._stream;
+ }
+
+ /**
+ * General constructor, performs basic initialization for our improved
+ * KeyboardEvent controller.
+ */
+ _KeyboardEventHandler(this._type):
+ _stream = new _CustomKeyEventStreamImpl('event'), _target = null,
+ super(_EVENT_TYPE);
+
+ /**
+ * Hook up all event listeners under the covers so we can estimate keycodes
+ * and charcodes when they are not provided.
+ */
+ _KeyboardEventHandler.initializeAllEventListeners(this._type, this._target) :
+ super(_EVENT_TYPE) {
+ throw 'Key event handling not supported in DDC';
+ /*
+ Element.keyDownEvent.forTarget(_target, useCapture: true).listen(
+ processKeyDown);
+ Element.keyPressEvent.forTarget(_target, useCapture: true).listen(
+ processKeyPress);
+ Element.keyUpEvent.forTarget(_target, useCapture: true).listen(
+ processKeyUp);
+ _stream = new _CustomKeyEventStreamImpl(_type);
+ */
+ }
+
+ /** Determine if caps lock is one of the currently depressed keys. */
+ bool get _capsLockOn =>
+ _keyDownList.any((var element) => element.keyCode == KeyCode.CAPS_LOCK);
+
+ /**
+ * Given the previously recorded keydown key codes, see if we can determine
+ * the keycode of this keypress [event]. (Generally browsers only provide
+ * charCode information for keypress events, but with a little
+ * reverse-engineering, we can also determine the keyCode.) Returns
+ * KeyCode.UNKNOWN if the keycode could not be determined.
+ */
+ int _determineKeyCodeForKeypress(KeyboardEvent event) {
+ // Note: This function is a work in progress. We'll expand this function
+ // once we get more information about other keyboards.
+ for (var prevEvent in _keyDownList) {
+ if (prevEvent._shadowCharCode == event.charCode) {
+ return prevEvent.keyCode;
+ }
+ if ((event.shiftKey || _capsLockOn) && event.charCode >= "A".codeUnits[0]
+ && event.charCode <= "Z".codeUnits[0] && event.charCode +
+ _ROMAN_ALPHABET_OFFSET == prevEvent._shadowCharCode) {
+ return prevEvent.keyCode;
+ }
+ }
+ return KeyCode.UNKNOWN;
+ }
+
+ /**
+ * Given the charater code returned from a keyDown [event], try to ascertain
+ * and return the corresponding charCode for the character that was pressed.
+ * This information is not shown to the user, but used to help polyfill
+ * keypress events.
+ */
+ int _findCharCodeKeyDown(KeyboardEvent event) {
+ if (event.keyLocation == 3) { // Numpad keys.
+ switch (event.keyCode) {
+ case KeyCode.NUM_ZERO:
+ // Even though this function returns _charCodes_, for some cases the
+ // KeyCode == the charCode we want, in which case we use the keycode
+ // constant for readability.
+ return KeyCode.ZERO;
+ case KeyCode.NUM_ONE:
+ return KeyCode.ONE;
+ case KeyCode.NUM_TWO:
+ return KeyCode.TWO;
+ case KeyCode.NUM_THREE:
+ return KeyCode.THREE;
+ case KeyCode.NUM_FOUR:
+ return KeyCode.FOUR;
+ case KeyCode.NUM_FIVE:
+ return KeyCode.FIVE;
+ case KeyCode.NUM_SIX:
+ return KeyCode.SIX;
+ case KeyCode.NUM_SEVEN:
+ return KeyCode.SEVEN;
+ case KeyCode.NUM_EIGHT:
+ return KeyCode.EIGHT;
+ case KeyCode.NUM_NINE:
+ return KeyCode.NINE;
+ case KeyCode.NUM_MULTIPLY:
+ return 42; // Char code for *
+ case KeyCode.NUM_PLUS:
+ return 43; // +
+ case KeyCode.NUM_MINUS:
+ return 45; // -
+ case KeyCode.NUM_PERIOD:
+ return 46; // .
+ case KeyCode.NUM_DIVISION:
+ return 47; // /
+ }
+ } else if (event.keyCode >= 65 && event.keyCode <= 90) {
+ // Set the "char code" for key down as the lower case letter. Again, this
+ // will not show up for the user, but will be helpful in estimating
+ // keyCode locations and other information during the keyPress event.
+ return event.keyCode + _ROMAN_ALPHABET_OFFSET;
+ }
+ switch(event.keyCode) {
+ case KeyCode.SEMICOLON:
+ return KeyCode.FF_SEMICOLON;
+ case KeyCode.EQUALS:
+ return KeyCode.FF_EQUALS;
+ case KeyCode.COMMA:
+ return 44; // Ascii value for ,
+ case KeyCode.DASH:
+ return 45; // -
+ case KeyCode.PERIOD:
+ return 46; // .
+ case KeyCode.SLASH:
+ return 47; // /
+ case KeyCode.APOSTROPHE:
+ return 96; // `
+ case KeyCode.OPEN_SQUARE_BRACKET:
+ return 91; // [
+ case KeyCode.BACKSLASH:
+ return 92; // \
+ case KeyCode.CLOSE_SQUARE_BRACKET:
+ return 93; // ]
+ case KeyCode.SINGLE_QUOTE:
+ return 39; // '
+ }
+ return event.keyCode;
+ }
+
+ /**
+ * Returns true if the key fires a keypress event in the current browser.
+ */
+ bool _firesKeyPressEvent(KeyEvent event) {
+ if (!Device.isIE && !Device.isWebKit) {
+ return true;
+ }
+
+ if (Device.userAgent.contains('Mac') && event.altKey) {
+ return KeyCode.isCharacterKey(event.keyCode);
+ }
+
+ // Alt but not AltGr which is represented as Alt+Ctrl.
+ if (event.altKey && !event.ctrlKey) {
+ return false;
+ }
+
+ // Saves Ctrl or Alt + key for IE and WebKit, which won't fire keypress.
+ if (!event.shiftKey &&
+ (_keyDownList.last.keyCode == KeyCode.CTRL ||
+ _keyDownList.last.keyCode == KeyCode.ALT ||
+ Device.userAgent.contains('Mac') &&
+ _keyDownList.last.keyCode == KeyCode.META)) {
+ return false;
+ }
+
+ // Some keys with Ctrl/Shift do not issue keypress in WebKit.
+ if (Device.isWebKit && event.ctrlKey && event.shiftKey && (
+ event.keyCode == KeyCode.BACKSLASH ||
+ event.keyCode == KeyCode.OPEN_SQUARE_BRACKET ||
+ event.keyCode == KeyCode.CLOSE_SQUARE_BRACKET ||
+ event.keyCode == KeyCode.TILDE ||
+ event.keyCode == KeyCode.SEMICOLON || event.keyCode == KeyCode.DASH ||
+ event.keyCode == KeyCode.EQUALS || event.keyCode == KeyCode.COMMA ||
+ event.keyCode == KeyCode.PERIOD || event.keyCode == KeyCode.SLASH ||
+ event.keyCode == KeyCode.APOSTROPHE ||
+ event.keyCode == KeyCode.SINGLE_QUOTE)) {
+ return false;
+ }
+
+ switch (event.keyCode) {
+ case KeyCode.ENTER:
+ // IE9 does not fire keypress on ENTER.
+ return !Device.isIE;
+ case KeyCode.ESC:
+ return !Device.isWebKit;
+ }
+
+ return KeyCode.isCharacterKey(event.keyCode);
+ }
+
+ /**
+ * Normalize the keycodes to the IE KeyCodes (this is what Chrome, IE, and
+ * Opera all use).
+ */
+ int _normalizeKeyCodes(KeyboardEvent event) {
+ // Note: This may change once we get input about non-US keyboards.
+ if (Device.isFirefox) {
+ switch(event.keyCode) {
+ case KeyCode.FF_EQUALS:
+ return KeyCode.EQUALS;
+ case KeyCode.FF_SEMICOLON:
+ return KeyCode.SEMICOLON;
+ case KeyCode.MAC_FF_META:
+ return KeyCode.META;
+ case KeyCode.WIN_KEY_FF_LINUX:
+ return KeyCode.WIN_KEY;
+ }
+ }
+ return event.keyCode;
+ }
+
+ /** Handle keydown events. */
+ void processKeyDown(KeyboardEvent e) {
+ // Ctrl-Tab and Alt-Tab can cause the focus to be moved to another window
+ // before we've caught a key-up event. If the last-key was one of these
+ // we reset the state.
+ if (_keyDownList.length > 0 &&
+ (_keyDownList.last.keyCode == KeyCode.CTRL && !e.ctrlKey ||
+ _keyDownList.last.keyCode == KeyCode.ALT && !e.altKey ||
+ Device.userAgent.contains('Mac') &&
+ _keyDownList.last.keyCode == KeyCode.META && !e.metaKey)) {
+ _keyDownList.clear();
+ }
+
+ var event = new KeyEvent.wrap(e);
+ event._shadowKeyCode = _normalizeKeyCodes(event);
+ // Technically a "keydown" event doesn't have a charCode. This is
+ // calculated nonetheless to provide us with more information in giving
+ // as much information as possible on keypress about keycode and also
+ // charCode.
+ event._shadowCharCode = _findCharCodeKeyDown(event);
+ if (_keyDownList.length > 0 && event.keyCode != _keyDownList.last.keyCode &&
+ !_firesKeyPressEvent(event)) {
+ // Some browsers have quirks not firing keypress events where all other
+ // browsers do. This makes them more consistent.
+ processKeyPress(e);
+ }
+ _keyDownList.add(event);
+ _stream.add(event);
+ }
+
+ /** Handle keypress events. */
+ void processKeyPress(KeyboardEvent event) {
+ var e = new KeyEvent.wrap(event);
+ // IE reports the character code in the keyCode field for keypress events.
+ // There are two exceptions however, Enter and Escape.
+ if (Device.isIE) {
+ if (e.keyCode == KeyCode.ENTER || e.keyCode == KeyCode.ESC) {
+ e._shadowCharCode = 0;
+ } else {
+ e._shadowCharCode = e.keyCode;
+ }
+ } else if (Device.isOpera) {
+ // Opera reports the character code in the keyCode field.
+ e._shadowCharCode = KeyCode.isCharacterKey(e.keyCode) ? e.keyCode : 0;
+ }
+ // Now we guestimate about what the keycode is that was actually
+ // pressed, given previous keydown information.
+ e._shadowKeyCode = _determineKeyCodeForKeypress(e);
+
+ // Correct the key value for certain browser-specific quirks.
+ if (e._shadowKeyIdentifier != null &&
+ _keyIdentifier.containsKey(e._shadowKeyIdentifier)) {
+ // This is needed for Safari Windows because it currently doesn't give a
+ // keyCode/which for non printable keys.
+ e._shadowKeyCode = _keyIdentifier[e._shadowKeyIdentifier];
+ }
+ e._shadowAltKey = _keyDownList.any((var element) => element.altKey);
+ _stream.add(e);
+ }
+
+ /** Handle keyup events. */
+ void processKeyUp(KeyboardEvent event) {
+ var e = new KeyEvent.wrap(event);
+ KeyboardEvent toRemove = null;
+ for (var key in _keyDownList) {
+ if (key.keyCode == e.keyCode) {
+ toRemove = key;
+ }
+ }
+ if (toRemove != null) {
+ _keyDownList.removeWhere((element) => element == toRemove);
+ } else if (_keyDownList.length > 0) {
+ // This happens when we've reached some international keyboard case we
+ // haven't accounted for or we haven't correctly eliminated all browser
+ // inconsistencies. Filing bugs on when this is reached is welcome!
+ _keyDownList.removeLast();
+ }
+ _stream.add(e);
+ }
+}
+
+
+/**
+ * Records KeyboardEvents that occur on a particular element, and provides a
+ * stream of outgoing KeyEvents with cross-browser consistent keyCode and
+ * charCode values despite the fact that a multitude of browsers that have
+ * varying keyboard default behavior.
+ *
+ * Example usage:
+ *
+ * KeyboardEventStream.onKeyDown(document.body).listen(
+ * keydownHandlerTest);
+ *
+ * This class is very much a work in progress, and we'd love to get information
+ * on how we can make this class work with as many international keyboards as
+ * possible. Bugs welcome!
+ */
+class KeyboardEventStream {
+
+ /** Named constructor to produce a stream for onKeyPress events. */
+ static CustomStream<KeyEvent> onKeyPress(EventTarget target) =>
+ new _KeyboardEventHandler('keypress').forTarget(target);
+
+ /** Named constructor to produce a stream for onKeyUp events. */
+ static CustomStream<KeyEvent> onKeyUp(EventTarget target) =>
+ new _KeyboardEventHandler('keyup').forTarget(target);
+
+ /** Named constructor to produce a stream for onKeyDown events. */
+ static CustomStream<KeyEvent> onKeyDown(EventTarget target) =>
+ new _KeyboardEventHandler('keydown').forTarget(target);
+}
+// Copyright (c) 2013, 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 which helps construct standard node validation policies.
+ *
+ * By default this will not accept anything, but the 'allow*' functions can be
+ * used to expand what types of elements or attributes are allowed.
+ *
+ * All allow functions are additive- elements will be accepted if they are
+ * accepted by any specific rule.
+ *
+ * It is important to remember that sanitization is not just intended to prevent
+ * cross-site scripting attacks, but also to prevent information from being
+ * displayed in unexpected ways. For example something displaying basic
+ * formatted text may not expect `<video>` tags to appear. In this case an
+ * empty NodeValidatorBuilder with just [allowTextElements] might be
+ * appropriate.
+ */
+class NodeValidatorBuilder implements NodeValidator {
+
+ final List<NodeValidator> _validators = <NodeValidator>[];
+
+ NodeValidatorBuilder() {
+ }
+
+ /**
+ * Creates a new NodeValidatorBuilder which accepts common constructs.
+ *
+ * By default this will accept HTML5 elements and attributes with the default
+ * [UriPolicy] and templating elements.
+ *
+ * Notable syntax which is filtered:
+ *
+ * * Only known-good HTML5 elements and attributes are allowed.
+ * * All URLs must be same-origin, use [allowNavigation] and [allowImages] to
+ * specify additional URI policies.
+ * * Inline-styles are not allowed.
+ * * Custom element tags are disallowed, use [allowCustomElement].
+ * * Custom tags extensions are disallowed, use [allowTagExtension].
+ * * SVG Elements are not allowed, use [allowSvg].
+ *
+ * For scenarios where the HTML should only contain formatted text
+ * [allowTextElements] is more appropriate.
+ *
+ * Use [allowSvg] to allow SVG elements.
+ */
+ NodeValidatorBuilder.common() {
+ allowHtml5();
+ allowTemplating();
+ }
+
+ /**
+ * Allows navigation elements- Form and Anchor tags, along with common
+ * attributes.
+ *
+ * The UriPolicy can be used to restrict the locations the navigation elements
+ * are allowed to direct to. By default this will use the default [UriPolicy].
+ */
+ void allowNavigation([UriPolicy uriPolicy]) {
+ if (uriPolicy == null) {
+ uriPolicy = new UriPolicy();
+ }
+ add(new _SimpleNodeValidator.allowNavigation(uriPolicy));
+ }
+
+ /**
+ * Allows image elements.
+ *
+ * The UriPolicy can be used to restrict the locations the images may be
+ * loaded from. By default this will use the default [UriPolicy].
+ */
+ void allowImages([UriPolicy uriPolicy]) {
+ if (uriPolicy == null) {
+ uriPolicy = new UriPolicy();
+ }
+ add(new _SimpleNodeValidator.allowImages(uriPolicy));
+ }
+
+ /**
+ * Allow basic text elements.
+ *
+ * This allows a subset of HTML5 elements, specifically just these tags and
+ * no attributes.
+ *
+ * * B
+ * * BLOCKQUOTE
+ * * BR
+ * * EM
+ * * H1
+ * * H2
+ * * H3
+ * * H4
+ * * H5
+ * * H6
+ * * HR
+ * * I
+ * * LI
+ * * OL
+ * * P
+ * * SPAN
+ * * UL
+ */
+ void allowTextElements() {
+ add(new _SimpleNodeValidator.allowTextElements());
+ }
+
+ /**
+ * Allow inline styles on elements.
+ *
+ * If [tagName] is not specified then this allows inline styles on all
+ * elements. Otherwise tagName limits the styles to the specified elements.
+ */
+ void allowInlineStyles({String tagName}) {
+ if (tagName == null) {
+ tagName = '*';
+ } else {
+ tagName = tagName.toUpperCase();
+ }
+ add(new _SimpleNodeValidator(null, allowedAttributes: ['$tagName::style']));
+ }
+
+ /**
+ * Allow common safe HTML5 elements and attributes.
+ *
+ * This list is based off of the Caja whitelists at:
+ * https://code.google.com/p/google-caja/wiki/CajaWhitelists.
+ *
+ * Common things which are not allowed are script elements, style attributes
+ * and any script handlers.
+ */
+ void allowHtml5({UriPolicy uriPolicy}) {
+ add(new _Html5NodeValidator(uriPolicy: uriPolicy));
+ }
+
+ /**
+ * Allow SVG elements and attributes except for known bad ones.
+ */
+ void allowSvg() {
+ throw 'SVG not supported with DDC';
+ // add(new _SvgNodeValidator());
+ }
+
+ /**
+ * Allow custom elements with the specified tag name and specified attributes.
+ *
+ * This will allow the elements as custom tags (such as <x-foo></x-foo>),
+ * but will not allow tag extensions. Use [allowTagExtension] to allow
+ * tag extensions.
+ */
+ void allowCustomElement(String tagName,
+ {UriPolicy uriPolicy,
+ Iterable<String> attributes,
+ Iterable<String> uriAttributes}) {
+
+ var tagNameUpper = tagName.toUpperCase();
+ var attrs;
+ if (attributes != null) {
+ attrs =
+ attributes.map((name) => '$tagNameUpper::${name.toLowerCase()}');
+ }
+ var uriAttrs;
+ if (uriAttributes != null) {
+ uriAttrs =
+ uriAttributes.map((name) => '$tagNameUpper::${name.toLowerCase()}');
+ }
+ if (uriPolicy == null) {
+ uriPolicy = new UriPolicy();
+ }
+
+ add(new _CustomElementNodeValidator(
+ uriPolicy,
+ [tagNameUpper],
+ attrs,
+ uriAttrs,
+ false,
+ true));
+ }
+
+ /**
+ * Allow custom tag extensions with the specified type name and specified
+ * attributes.
+ *
+ * This will allow tag extensions (such as <div is="x-foo"></div>),
+ * but will not allow custom tags. Use [allowCustomElement] to allow
+ * custom tags.
+ */
+ void allowTagExtension(String tagName, String baseName,
+ {UriPolicy uriPolicy,
+ Iterable<String> attributes,
+ Iterable<String> uriAttributes}) {
+
+ var baseNameUpper = baseName.toUpperCase();
+ var tagNameUpper = tagName.toUpperCase();
+ var attrs;
+ if (attributes != null) {
+ attrs =
+ attributes.map((name) => '$baseNameUpper::${name.toLowerCase()}');
+ }
+ var uriAttrs;
+ if (uriAttributes != null) {
+ uriAttrs =
+ uriAttributes.map((name) => '$baseNameUpper::${name.toLowerCase()}');
+ }
+ if (uriPolicy == null) {
+ uriPolicy = new UriPolicy();
+ }
+
+ add(new _CustomElementNodeValidator(
+ uriPolicy,
+ [tagNameUpper, baseNameUpper],
+ attrs,
+ uriAttrs,
+ true,
+ false));
+ }
+
+ void allowElement(String tagName, {UriPolicy uriPolicy,
+ Iterable<String> attributes,
+ Iterable<String> uriAttributes}) {
+
+ allowCustomElement(tagName, uriPolicy: uriPolicy,
+ attributes: attributes,
+ uriAttributes: uriAttributes);
+ }
+
+ /**
+ * Allow templating elements (such as <template> and template-related
+ * attributes.
+ *
+ * This still requires other validators to allow regular attributes to be
+ * bound (such as [allowHtml5]).
+ */
+ void allowTemplating() {
+ add(new _TemplatingNodeValidator());
+ }
+
+ /**
+ * Add an additional validator to the current list of validators.
+ *
+ * Elements and attributes will be accepted if they are accepted by any
+ * validators.
+ */
+ void add(NodeValidator validator) {
+ _validators.add(validator);
+ }
+
+ bool allowsElement(Element element) {
+ return _validators.any((v) => v.allowsElement(element));
+ }
+
+ bool allowsAttribute(Element element, String attributeName, String value) {
+ return _validators.any(
+ (v) => v.allowsAttribute(element, attributeName, value));
+ }
+}
+
+class _SimpleNodeValidator implements NodeValidator {
+ final Set<String> allowedElements = new Set<String>();
+ final Set<String> allowedAttributes = new Set<String>();
+ final Set<String> allowedUriAttributes = new Set<String>();
+ final UriPolicy uriPolicy;
+
+ factory _SimpleNodeValidator.allowNavigation(UriPolicy uriPolicy) {
+ return new _SimpleNodeValidator(uriPolicy,
+ allowedElements: const [
+ 'A',
+ 'FORM'],
+ allowedAttributes: const [
+ 'A::accesskey',
+ 'A::coords',
+ 'A::hreflang',
+ 'A::name',
+ 'A::shape',
+ 'A::tabindex',
+ 'A::target',
+ 'A::type',
+ 'FORM::accept',
+ 'FORM::autocomplete',
+ 'FORM::enctype',
+ 'FORM::method',
+ 'FORM::name',
+ 'FORM::novalidate',
+ 'FORM::target',
+ ],
+ allowedUriAttributes: const [
+ 'A::href',
+ 'FORM::action',
+ ]);
+ }
+
+ factory _SimpleNodeValidator.allowImages(UriPolicy uriPolicy) {
+ return new _SimpleNodeValidator(uriPolicy,
+ allowedElements: const [
+ 'IMG'
+ ],
+ allowedAttributes: const [
+ 'IMG::align',
+ 'IMG::alt',
+ 'IMG::border',
+ 'IMG::height',
+ 'IMG::hspace',
+ 'IMG::ismap',
+ 'IMG::name',
+ 'IMG::usemap',
+ 'IMG::vspace',
+ 'IMG::width',
+ ],
+ allowedUriAttributes: const [
+ 'IMG::src',
+ ]);
+ }
+
+ factory _SimpleNodeValidator.allowTextElements() {
+ return new _SimpleNodeValidator(null,
+ allowedElements: const [
+ 'B',
+ 'BLOCKQUOTE',
+ 'BR',
+ 'EM',
+ 'H1',
+ 'H2',
+ 'H3',
+ 'H4',
+ 'H5',
+ 'H6',
+ 'HR',
+ 'I',
+ 'LI',
+ 'OL',
+ 'P',
+ 'SPAN',
+ 'UL',
+ ]);
+ }
+
+ /**
+ * Elements must be uppercased tag names. For example `'IMG'`.
+ * Attributes must be uppercased tag name followed by :: followed by
+ * lowercase attribute name. For example `'IMG:src'`.
+ */
+ _SimpleNodeValidator(this.uriPolicy,
+ {Iterable<String> allowedElements, Iterable<String> allowedAttributes,
+ Iterable<String> allowedUriAttributes}) {
+ this.allowedElements.addAll(allowedElements ?? const []);
+ allowedAttributes = allowedAttributes ?? const [];
+ allowedUriAttributes = allowedUriAttributes ?? const [];
+ var legalAttributes = allowedAttributes.where(
+ (x) => !_Html5NodeValidator._uriAttributes.contains(x));
+ var extraUriAttributes = allowedAttributes.where(
+ (x) => _Html5NodeValidator._uriAttributes.contains(x));
+ this.allowedAttributes.addAll(legalAttributes);
+ this.allowedUriAttributes.addAll(allowedUriAttributes);
+ this.allowedUriAttributes.addAll(extraUriAttributes);
+ }
+
+ bool allowsElement(Element element) {
+ return allowedElements.contains(Element._safeTagName(element));
+ }
+
+ bool allowsAttribute(Element element, String attributeName, String value) {
+ var tagName = Element._safeTagName(element);
+ if (allowedUriAttributes.contains('$tagName::$attributeName')) {
+ return uriPolicy.allowsUri(value);
+ } else if (allowedUriAttributes.contains('*::$attributeName')) {
+ return uriPolicy.allowsUri(value);
+ } else if (allowedAttributes.contains('$tagName::$attributeName')) {
+ return true;
+ } else if (allowedAttributes.contains('*::$attributeName')) {
+ return true;
+ } else if (allowedAttributes.contains('$tagName::*')) {
+ return true;
+ } else if (allowedAttributes.contains('*::*')) {
+ return true;
+ }
+ return false;
+ }
+}
+
+class _CustomElementNodeValidator extends _SimpleNodeValidator {
+ final bool allowTypeExtension;
+ final bool allowCustomTag;
+
+ _CustomElementNodeValidator(UriPolicy uriPolicy,
+ Iterable<String> allowedElements,
+ Iterable<String> allowedAttributes,
+ Iterable<String> allowedUriAttributes,
+ bool allowTypeExtension,
+ bool allowCustomTag):
+
+ this.allowTypeExtension = allowTypeExtension == true,
+ this.allowCustomTag = allowCustomTag == true,
+ super(uriPolicy,
+ allowedElements: allowedElements,
+ allowedAttributes: allowedAttributes,
+ allowedUriAttributes: allowedUriAttributes);
+
+ bool allowsElement(Element element) {
+ if (allowTypeExtension) {
+ var isAttr = element.attributes['is'];
+ if (isAttr != null) {
+ return allowedElements.contains(isAttr.toUpperCase()) &&
+ allowedElements.contains(Element._safeTagName(element));
+ }
+ }
+ return allowCustomTag && allowedElements.contains(Element._safeTagName(element));
+ }
+
+ bool allowsAttribute(Element element, String attributeName, String value) {
+ if (allowsElement(element)) {
+ if (allowTypeExtension && attributeName == 'is' &&
+ allowedElements.contains(value.toUpperCase())) {
+ return true;
+ }
+ return super.allowsAttribute(element, attributeName, value);
+ }
+ return false;
+ }
+}
+
+class _TemplatingNodeValidator extends _SimpleNodeValidator {
+ static const _TEMPLATE_ATTRS =
+ const <String>['bind', 'if', 'ref', 'repeat', 'syntax'];
+
+ final Set<String> _templateAttrs;
+
+ _TemplatingNodeValidator():
+ _templateAttrs = new Set<String>.from(_TEMPLATE_ATTRS),
+ super(null,
+ allowedElements: [
+ 'TEMPLATE'
+ ],
+ allowedAttributes: _TEMPLATE_ATTRS.map((attr) => 'TEMPLATE::$attr'));
+
+ bool allowsAttribute(Element element, String attributeName, String value) {
+ if (super.allowsAttribute(element, attributeName, value)) {
+ return true;
+ }
+
+ if (attributeName == 'template' && value == "") {
+ return true;
+ }
+
+ if (element.attributes['template'] == "" ) {
+ return _templateAttrs.contains(attributeName);
+ }
+ return false;
+ }
+}
+
+/*
+class _SvgNodeValidator implements NodeValidator {
+ bool allowsElement(Element element) {
+ if (element is svg.ScriptElement) {
+ return false;
+ }
+ // Firefox 37 has issues with creating foreign elements inside a
+ // foreignobject tag as SvgElement. We don't want foreignobject contents
+ // anyway, so just remove the whole tree outright. And we can't rely
+ // on IE recognizing the SvgForeignObject type, so go by tagName. Bug 23144
+ if (element is svg.SvgElement && Element._safeTagName(element) == 'foreignObject') {
+ return false;
+ }
+ if (element is svg.SvgElement) {
+ return true;
+ }
+ return false;
+ }
+
+ bool allowsAttribute(Element element, String attributeName, String value) {
+ if (attributeName == 'is' || attributeName.startsWith('on')) {
+ return false;
+ }
+ return allowsElement(element);
+ }
+}
+*/// 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.
+
+
+/**
+ * Contains the set of standard values returned by HTMLDocument.getReadyState.
+ */
+abstract class ReadyState {
+ /**
+ * Indicates the document is still loading and parsing.
+ */
+ static const String LOADING = "loading";
+
+ /**
+ * Indicates the document is finished parsing but is still loading
+ * subresources.
+ */
+ static const String INTERACTIVE = "interactive";
+
+ /**
+ * Indicates the document and all subresources have been loaded.
+ */
+ static const String COMPLETE = "complete";
+}
+// Copyright (c) 2013, 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.
+
+
+/**
+ * A list which just wraps another list, for either intercepting list calls or
+ * retyping the list (for example, from List<A> to List<B> where B extends A).
+ */
+class _WrappedList<E extends Node> extends ListBase<E>
+ implements NodeListWrapper {
+ final List _list;
+
+ _WrappedList(this._list);
+
+ // Iterable APIs
+
+ Iterator<E> get iterator => new _WrappedIterator(_list.iterator);
+
+ int get length => _list.length;
+
+ // Collection APIs
+
+ void add(E element) { _list.add(element); }
+
+ bool remove(Object element) => _list.remove(element);
+
+ void clear() { _list.clear(); }
+
+ // List APIs
+
+ E operator [](int index) => _list[index];
+
+ void operator []=(int index, E value) { _list[index] = value; }
+
+ set length(int newLength) { _list.length = newLength; }
+
+ void sort([int compare(E a, E b)]) { _list.sort(compare); }
+
+ int indexOf(Object element, [int start = 0]) => _list.indexOf(element, start);
+
+ int lastIndexOf(Object element, [int start]) => _list.lastIndexOf(element, start);
+
+ void insert(int index, E element) => _list.insert(index, element);
+
+ E removeAt(int index) => _list.removeAt(index);
+
+ void setRange(int start, int end, Iterable<E> iterable, [int skipCount = 0]) {
+ _list.setRange(start, end, iterable, skipCount);
+ }
+
+ void removeRange(int start, int end) { _list.removeRange(start, end); }
+
+ void replaceRange(int start, int end, Iterable<E> iterable) {
+ _list.replaceRange(start, end, iterable);
+ }
+
+ void fillRange(int start, int end, [E fillValue]) {
+ _list.fillRange(start, end, fillValue);
+ }
+
+ List<Node> get rawList => _list;
+}
+
+/**
+ * Iterator wrapper for _WrappedList.
+ */
+class _WrappedIterator<E> implements Iterator<E> {
+ Iterator _iterator;
+
+ _WrappedIterator(this._iterator);
+
+ bool moveNext() {
+ return _iterator.moveNext();
+ }
+
+ E get current => _iterator.current;
+}
+// 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.
+
+
+class _HttpRequestUtils {
+
+ // Helper for factory HttpRequest.get
+ static HttpRequest get(String url,
+ onComplete(HttpRequest request),
+ bool withCredentials) {
+ final request = new HttpRequest();
+ request.open('GET', url, async: true);
+
+ request.withCredentials = withCredentials;
+
+ request.onReadyStateChange.listen((e) {
+ if (request.readyState == HttpRequest.DONE) {
+ onComplete(request);
+ }
+ });
+
+ request.send();
+
+ return request;
+ }
+}
+// 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.
+
+
+// Iterator for arrays with fixed size.
+class FixedSizeListIterator<T> implements Iterator<T> {
+ final List<T> _array;
+ final int _length; // Cache array length for faster access.
+ int _position;
+ T _current;
+
+ FixedSizeListIterator(List<T> array)
+ : _array = array,
+ _position = -1,
+ _length = array.length;
+
+ bool moveNext() {
+ int nextPosition = _position + 1;
+ if (nextPosition < _length) {
+ _current = _array[nextPosition];
+ _position = nextPosition;
+ return true;
+ }
+ _current = null;
+ _position = _length;
+ return false;
+ }
+
+ T get current => _current;
+}
+
+// Iterator for arrays with variable size.
+class _VariableSizeListIterator<T> implements Iterator<T> {
+ final List<T> _array;
+ int _position;
+ T _current;
+
+ _VariableSizeListIterator(List<T> array)
+ : _array = array,
+ _position = -1;
+
+ bool moveNext() {
+ int nextPosition = _position + 1;
+ if (nextPosition < _array.length) {
+ _current = _array[nextPosition];
+ _position = nextPosition;
+ return true;
+ }
+ _current = null;
+ _position = _array.length;
+ return false;
+ }
+
+ T get current => _current;
+}
+// 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.
+
+
+// Conversions for Window. These check if the window is the local
+// window, and if it's not, wraps or unwraps it with a secure wrapper.
+// We need to test for EventTarget here as well as it's a base type.
+// We omit an unwrapper for Window as no methods take a non-local
+// window as a parameter.
+
+
+WindowBase _convertNativeToDart_Window(win) {
+ if (win == null) return null;
+ return _DOMWindowCrossFrame._createSafe(win);
+}
+
+EventTarget _convertNativeToDart_EventTarget(e) {
+ if (e == null) {
+ return null;
+ }
+ // Assume it's a Window if it contains the postMessage property. It may be
+ // from a different frame - without a patched prototype - so we cannot
+ // rely on Dart type checking.
+ if (JS('bool', r'"postMessage" in #', e)) {
+ var window = _DOMWindowCrossFrame._createSafe(e);
+ // If it's a native window.
+ if (window is EventTarget) {
+ return window;
+ }
+ return null;
+ }
+ else
+ return e;
+}
+
+EventTarget _convertDartToNative_EventTarget(e) {
+ if (e is _DOMWindowCrossFrame) {
+ return e._window;
+ } else {
+ return e;
+ }
+}
+
+_convertNativeToDart_XHR_Response(o) {
+ if (o is Document) {
+ return o;
+ }
+ return convertNativeToDart_SerializedScriptValue(o);
+}
+// 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.
+
+
+// TODO(vsm): Unify with Dartium version.
+class _DOMWindowCrossFrame implements WindowBase {
+ // Private window. Note, this is a window in another frame, so it
+ // cannot be typed as "Window" as its prototype is not patched
+ // properly. Its fields and methods can only be accessed via JavaScript.
+ final _window;
+
+ // Fields.
+ HistoryBase get history =>
+ _HistoryCrossFrame._createSafe(JS('HistoryBase', '#.history', _window));
+ LocationBase get location =>
+ _LocationCrossFrame._createSafe(JS('LocationBase', '#.location', _window));
+
+ // TODO(vsm): Add frames to navigate subframes. See 2312.
+
+ bool get closed => JS('bool', '#.closed', _window);
+
+ WindowBase get opener => _createSafe(JS('WindowBase', '#.opener', _window));
+
+ WindowBase get parent => _createSafe(JS('WindowBase', '#.parent', _window));
+
+ WindowBase get top => _createSafe(JS('WindowBase', '#.top', _window));
+
+ // Methods.
+ void close() => JS('void', '#.close()', _window);
+
+ void postMessage(var message, String targetOrigin, [List messagePorts = null]) {
+ if (messagePorts == null) {
+ JS('void', '#.postMessage(#,#)', _window,
+ convertDartToNative_SerializedScriptValue(message), targetOrigin);
+ } else {
+ JS('void', '#.postMessage(#,#,#)', _window,
+ convertDartToNative_SerializedScriptValue(message), targetOrigin,
+ messagePorts);
+ }
+ }
+
+ // Implementation support.
+ _DOMWindowCrossFrame(this._window);
+
+ static WindowBase _createSafe(w) {
+ if (identical(w, window)) {
+ return w;
+ } else {
+ // TODO(vsm): Cache or implement equality.
+ return new _DOMWindowCrossFrame(w);
+ }
+ }
+
+ // TODO(efortuna): Remove this method. dartbug.com/16814
+ Events get on => throw new UnsupportedError(
+ 'You can only attach EventListeners to your own window.');
+ // TODO(efortuna): Remove this method. dartbug.com/16814
+ void _addEventListener([String type, EventListener listener, bool useCapture])
+ => throw new UnsupportedError(
+ 'You can only attach EventListeners to your own window.');
+ // TODO(efortuna): Remove this method. dartbug.com/16814
+ void addEventListener(String type, EventListener listener, [bool useCapture])
+ => throw new UnsupportedError(
+ 'You can only attach EventListeners to your own window.');
+ // TODO(efortuna): Remove this method. dartbug.com/16814
+ bool dispatchEvent(Event event) => throw new UnsupportedError(
+ 'You can only attach EventListeners to your own window.');
+ // TODO(efortuna): Remove this method. dartbug.com/16814
+ void _removeEventListener([String type, EventListener listener,
+ bool useCapture]) => throw new UnsupportedError(
+ 'You can only attach EventListeners to your own window.');
+ // TODO(efortuna): Remove this method. dartbug.com/16814
+ void removeEventListener(String type, EventListener listener,
+ [bool useCapture]) => throw new UnsupportedError(
+ 'You can only attach EventListeners to your own window.');
+}
+
+class _LocationCrossFrame implements LocationBase {
+ // Private location. Note, this is a location object in another frame, so it
+ // cannot be typed as "Location" as its prototype is not patched
+ // properly. Its fields and methods can only be accessed via JavaScript.
+ var _location;
+
+ set href(String val) => _setHref(_location, val);
+ static void _setHref(location, val) {
+ JS('void', '#.href = #', location, val);
+ }
+
+ // Implementation support.
+ _LocationCrossFrame(this._location);
+
+ static LocationBase _createSafe(location) {
+ if (identical(location, window.location)) {
+ return location;
+ } else {
+ // TODO(vsm): Cache or implement equality.
+ return new _LocationCrossFrame(location);
+ }
+ }
+}
+
+class _HistoryCrossFrame implements HistoryBase {
+ // Private history. Note, this is a history object in another frame, so it
+ // cannot be typed as "History" as its prototype is not patched
+ // properly. Its fields and methods can only be accessed via JavaScript.
+ var _history;
+
+ void back() => JS('void', '#.back()', _history);
+
+ void forward() => JS('void', '#.forward()', _history);
+
+ void go(int distance) => JS('void', '#.go(#)', _history, distance);
+
+ // Implementation support.
+ _HistoryCrossFrame(this._history);
+
+ static HistoryBase _createSafe(h) {
+ if (identical(h, window.history)) {
+ return h;
+ } else {
+ // TODO(vsm): Cache or implement equality.
+ return new _HistoryCrossFrame(h);
+ }
+ }
+}
+/**
+ * A custom KeyboardEvent that attempts to eliminate cross-browser
+ * inconsistencies, and also provide both keyCode and charCode information
+ * for all key events (when such information can be determined).
+ *
+ * KeyEvent tries to provide a higher level, more polished keyboard event
+ * information on top of the "raw" [KeyboardEvent].
+ *
+ * The mechanics of using KeyEvents is a little different from the underlying
+ * [KeyboardEvent]. To use KeyEvents, you need to create a stream and then add
+ * KeyEvents to the stream, rather than using the [EventTarget.dispatchEvent].
+ * Here's an example usage:
+ *
+ * // Initialize a stream for the KeyEvents:
+ * var stream = KeyEvent.keyPressEvent.forTarget(document.body);
+ * // Start listening to the stream of KeyEvents.
+ * stream.listen((keyEvent) =>
+ * window.console.log('KeyPress event detected ${keyEvent.charCode}'));
+ * ...
+ * // Add a new KeyEvent of someone pressing the 'A' key to the stream so
+ * // listeners can know a KeyEvent happened.
+ * stream.add(new KeyEvent('keypress', keyCode: 65, charCode: 97));
+ *
+ * This class is very much a work in progress, and we'd love to get information
+ * on how we can make this class work with as many international keyboards as
+ * possible. Bugs welcome!
+ */
+@Experimental()
+class KeyEvent extends _WrappedEvent implements KeyboardEvent {
+ /** The parent KeyboardEvent that this KeyEvent is wrapping and "fixing". */
+ KeyboardEvent _parent;
+
+ /** The "fixed" value of whether the alt key is being pressed. */
+ bool _shadowAltKey;
+
+ /** Caculated value of what the estimated charCode is for this event. */
+ int _shadowCharCode;
+
+ /** Caculated value of what the estimated keyCode is for this event. */
+ int _shadowKeyCode;
+
+ /** Caculated value of what the estimated keyCode is for this event. */
+ int get keyCode => _shadowKeyCode;
+
+ /** Caculated value of what the estimated charCode is for this event. */
+ int get charCode => this.type == 'keypress' ? _shadowCharCode : 0;
+
+ /** Caculated value of whether the alt key is pressed is for this event. */
+ bool get altKey => _shadowAltKey;
+
+ /** Caculated value of what the estimated keyCode is for this event. */
+ int get which => keyCode;
+
+ /** Accessor to the underlying keyCode value is the parent event. */
+ int get _realKeyCode => JS('int', '#.keyCode', _parent);
+
+ /** Accessor to the underlying charCode value is the parent event. */
+ int get _realCharCode => JS('int', '#.charCode', _parent);
+
+ /** Accessor to the underlying altKey value is the parent event. */
+ bool get _realAltKey => JS('bool', '#.altKey', _parent);
+
+ /** Shadows on top of the parent's currentTarget. */
+ EventTarget _currentTarget;
+
+ /**
+ * The value we want to use for this object's dispatch. Created here so it is
+ * only invoked once.
+ */
+ static final _keyboardEventDispatchRecord = _makeRecord();
+
+ /** Helper to statically create the dispatch record. */
+ static _makeRecord() {
+ var interceptor = JS_INTERCEPTOR_CONSTANT(KeyboardEvent);
+ return makeLeafDispatchRecord(interceptor);
+ }
+
+ /** Construct a KeyEvent with [parent] as the event we're emulating. */
+ KeyEvent.wrap(KeyboardEvent parent): super(parent) {
+ _parent = parent;
+ _shadowAltKey = _realAltKey;
+ _shadowCharCode = _realCharCode;
+ _shadowKeyCode = _realKeyCode;
+ _currentTarget = _parent.currentTarget;
+ }
+
+ /** Programmatically create a new KeyEvent (and KeyboardEvent). */
+ factory KeyEvent(String type,
+ {Window view, bool canBubble: true, bool cancelable: true, int keyCode: 0,
+ int charCode: 0, int keyLocation: 1, bool ctrlKey: false,
+ bool altKey: false, bool shiftKey: false, bool metaKey: false,
+ EventTarget currentTarget}) {
+ if (view == null) {
+ view = window;
+ }
+
+ var eventObj;
+ // In these two branches we create an underlying native KeyboardEvent, but
+ // we set it with our specified values. Because we are doing custom setting
+ // of certain values (charCode/keyCode, etc) only in this class (as opposed
+ // to KeyboardEvent) and the way we set these custom values depends on the
+ // type of underlying JS object, we do all the contruction for the
+ // underlying KeyboardEvent here.
+ if (canUseDispatchEvent) {
+ // Currently works in everything but Internet Explorer.
+ eventObj = new Event.eventType('Event', type,
+ canBubble: canBubble, cancelable: cancelable);
+
+ JS('void', '#.keyCode = #', eventObj, keyCode);
+ JS('void', '#.which = #', eventObj, keyCode);
+ JS('void', '#.charCode = #', eventObj, charCode);
+
+ JS('void', '#.keyLocation = #', eventObj, keyLocation);
+ JS('void', '#.ctrlKey = #', eventObj, ctrlKey);
+ JS('void', '#.altKey = #', eventObj, altKey);
+ JS('void', '#.shiftKey = #', eventObj, shiftKey);
+ JS('void', '#.metaKey = #', eventObj, metaKey);
+ } else {
+ // Currently this works on everything but Safari. Safari throws an
+ // "Attempting to change access mechanism for an unconfigurable property"
+ // TypeError when trying to do the Object.defineProperty hack, so we avoid
+ // this branch if possible.
+ // Also, if we want this branch to work in FF, we also need to modify
+ // _initKeyboardEvent to also take charCode and keyCode values to
+ // initialize initKeyEvent.
+
+ eventObj = new Event.eventType('KeyboardEvent', type,
+ canBubble: canBubble, cancelable: cancelable);
+
+ // Chromium Hack
+ JS('void', "Object.defineProperty(#, 'keyCode', {"
+ " get : function() { return this.keyCodeVal; } })", eventObj);
+ JS('void', "Object.defineProperty(#, 'which', {"
+ " get : function() { return this.keyCodeVal; } })", eventObj);
+ JS('void', "Object.defineProperty(#, 'charCode', {"
+ " get : function() { return this.charCodeVal; } })", eventObj);
+
+ var keyIdentifier = _convertToHexString(charCode, keyCode);
+ eventObj._initKeyboardEvent(type, canBubble, cancelable, view,
+ keyIdentifier, keyLocation, ctrlKey, altKey, shiftKey, metaKey);
+ JS('void', '#.keyCodeVal = #', eventObj, keyCode);
+ JS('void', '#.charCodeVal = #', eventObj, charCode);
+ }
+ // Tell dart2js that it smells like a KeyboardEvent!
+ setDispatchProperty(eventObj, _keyboardEventDispatchRecord);
+
+ var keyEvent = new KeyEvent.wrap(eventObj);
+ if (keyEvent._currentTarget == null) {
+ keyEvent._currentTarget = currentTarget == null ? window : currentTarget;
+ }
+ return keyEvent;
+ }
+
+ // Currently known to work on all browsers but IE.
+ static bool get canUseDispatchEvent =>
+ JS('bool',
+ '(typeof document.body.dispatchEvent == "function")'
+ '&& document.body.dispatchEvent.length > 0');
+
+ /** The currently registered target for this event. */
+ EventTarget get currentTarget => _currentTarget;
+
+ // This is an experimental method to be sure.
+ static String _convertToHexString(int charCode, int keyCode) {
+ if (charCode != -1) {
+ var hex = charCode.toRadixString(16); // Convert to hexadecimal.
+ StringBuffer sb = new StringBuffer('U+');
+ for (int i = 0; i < 4 - hex.length; i++) sb.write('0');
+ sb.write(hex);
+ return sb.toString();
+ } else {
+ return KeyCode._convertKeyCodeToKeyName(keyCode);
+ }
+ }
+
+ // TODO(efortuna): If KeyEvent is sufficiently successful that we want to make
+ // it the default keyboard event handling, move these methods over to Element.
+ /** Accessor to provide a stream of KeyEvents on the desired target. */
+ static EventStreamProvider<KeyEvent> keyDownEvent =
+ new _KeyboardEventHandler('keydown');
+ /** Accessor to provide a stream of KeyEvents on the desired target. */
+ static EventStreamProvider<KeyEvent> keyUpEvent =
+ new _KeyboardEventHandler('keyup');
+ /** Accessor to provide a stream of KeyEvents on the desired target. */
+ static EventStreamProvider<KeyEvent> keyPressEvent =
+ new _KeyboardEventHandler('keypress');
+
+ /** Accessor to the clipboardData available for this event. */
+ DataTransfer get clipboardData => _parent.clipboardData;
+ /** True if the ctrl key is pressed during this event. */
+ bool get ctrlKey => _parent.ctrlKey;
+ int get detail => _parent.detail;
+ /**
+ * Accessor to the part of the keyboard that the key was pressed from (one of
+ * KeyLocation.STANDARD, KeyLocation.RIGHT, KeyLocation.LEFT,
+ * KeyLocation.NUMPAD, KeyLocation.MOBILE, KeyLocation.JOYSTICK).
+ */
+ int get keyLocation => _parent.keyLocation;
+ Point get layer => _parent.layer;
+ /** True if the Meta (or Mac command) key is pressed during this event. */
+ bool get metaKey => _parent.metaKey;
+ Point get page => _parent.page;
+ /** True if the shift key was pressed during this event. */
+ bool get shiftKey => _parent.shiftKey;
+ Window get view => _parent.view;
+ void _initUIEvent(String type, bool canBubble, bool cancelable,
+ Window view, int detail) {
+ throw new UnsupportedError("Cannot initialize a UI Event from a KeyEvent.");
+ }
+ String get _shadowKeyIdentifier => JS('String', '#.keyIdentifier', _parent);
+
+ int get _charCode => charCode;
+ int get _keyCode => keyCode;
+ String get _keyIdentifier {
+ throw new UnsupportedError("keyIdentifier is unsupported.");
+ }
+ void _initKeyboardEvent(String type, bool canBubble, bool cancelable,
+ Window view, String keyIdentifier, int keyLocation, bool ctrlKey,
+ bool altKey, bool shiftKey, bool metaKey) {
+ throw new UnsupportedError(
+ "Cannot initialize a KeyboardEvent from a KeyEvent.");
+ }
+ int get _layerX => throw new UnsupportedError('Not applicable to KeyEvent');
+ int get _layerY => throw new UnsupportedError('Not applicable to KeyEvent');
+ int get _pageX => throw new UnsupportedError('Not applicable to KeyEvent');
+ int get _pageY => throw new UnsupportedError('Not applicable to KeyEvent');
+ @Experimental() // untriaged
+ bool getModifierState(String keyArgument) => throw new UnimplementedError();
+ @Experimental() // untriaged
+ int get location => throw new UnimplementedError();
+ @Experimental() // untriaged
+ bool get repeat => throw new UnimplementedError();
+ dynamic get _get_view => throw new UnimplementedError();
+}
+// Copyright (c) 2013, 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 Platform {
+ /**
+ * Returns true if dart:typed_data types are supported on this
+ * browser. If false, using these types will generate a runtime
+ * error.
+ */
+ static final supportsTypedData = JS('bool', '!!(window.ArrayBuffer)');
+
+ /**
+ * Returns true if SIMD types in dart:typed_data types are supported
+ * on this browser. If false, using these types will generate a runtime
+ * error.
+ */
+ static final supportsSimd = false;
+}
+// Copyright (c) 2013, 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.
+
+
+/**
+ * Helper class to implement custom events which wrap DOM events.
+ */
+class _WrappedEvent implements Event {
+ final Event wrapped;
+
+ /** The CSS selector involved with event delegation. */
+ String _selector;
+
+ _WrappedEvent(this.wrapped);
+
+ bool get bubbles => wrapped.bubbles;
+
+ bool get cancelable => wrapped.cancelable;
+
+ DataTransfer get clipboardData => wrapped.clipboardData;
+
+ EventTarget get currentTarget => wrapped.currentTarget;
+
+ bool get defaultPrevented => wrapped.defaultPrevented;
+
+ int get eventPhase => wrapped.eventPhase;
+
+ EventTarget get target => wrapped.target;
+
+ int get timeStamp => wrapped.timeStamp;
+
+ String get type => wrapped.type;
+
+ void _initEvent(String eventTypeArg, bool canBubbleArg,
+ bool cancelableArg) {
+ throw new UnsupportedError(
+ 'Cannot initialize this Event.');
+ }
+
+ void preventDefault() {
+ wrapped.preventDefault();
+ }
+
+ void stopImmediatePropagation() {
+ wrapped.stopImmediatePropagation();
+ }
+
+ void stopPropagation() {
+ wrapped.stopPropagation();
+ }
+
+ /**
+ * A pointer to the element whose CSS selector matched within which an event
+ * was fired. If this Event was not associated with any Event delegation,
+ * accessing this value will throw an [UnsupportedError].
+ */
+ Element get matchingTarget {
+ if (_selector == null) {
+ throw new UnsupportedError('Cannot call matchingTarget if this Event did'
+ ' not arise as a result of event delegation.');
+ }
+ var currentTarget = this.currentTarget;
+ var target = this.target;
+ var matchedTarget;
+ do {
+ if (target.matches(_selector)) return target;
+ target = target.parent;
+ } while (target != null && target != currentTarget.parent);
+ throw new StateError('No selector matched for populating matchedTarget.');
+ }
+
+ /**
+ * This event's path, taking into account shadow DOM.
+ *
+ * ## Other resources
+ *
+ * * [Shadow DOM extensions to Event]
+ * (http://w3c.github.io/webcomponents/spec/shadow/#extensions-to-event) from
+ * W3C.
+ */
+ // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#extensions-to-event
+ @Experimental()
+ List<Node> get path => wrapped.path;
+
+ dynamic get _get_currentTarget => wrapped._get_currentTarget;
+
+ dynamic get _get_target => wrapped._get_target;
+}
+// Copyright (c) 2013, 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.
+
+
+_wrapZone(callback(arg)) {
+ // For performance reasons avoid wrapping if we are in the root zone.
+ if (Zone.current == Zone.ROOT) return callback;
+ if (callback == null) return null;
+ return Zone.current.bindUnaryCallback(callback, runGuarded: true);
+}
+
+_wrapBinaryZone(callback(arg1, arg2)) {
+ if (Zone.current == Zone.ROOT) return callback;
+ if (callback == null) return null;
+ return Zone.current.bindBinaryCallback(callback, runGuarded: true);
+}
+
+/**
+ * Alias for [querySelector]. Note this function is deprecated because its
+ * semantics will be changing in the future.
+ */
+@deprecated
+@Experimental()
+Element query(String relativeSelectors) => document.query(relativeSelectors);
+/**
+ * Alias for [querySelectorAll]. Note this function is deprecated because its
+ * semantics will be changing in the future.
+ */
+@deprecated
+@Experimental()
+ElementList<Element> queryAll(String relativeSelectors) => document.queryAll(relativeSelectors);
+
+/**
+ * Finds the first descendant element of this document that matches the
+ * specified group of selectors.
+ *
+ * Unless your webpage contains multiple documents, the top-level
+ * [querySelector]
+ * method behaves the same as this method, so you should use it instead to
+ * save typing a few characters.
+ *
+ * [selectors] should be a string using CSS selector syntax.
+ *
+ * var element1 = document.querySelector('.className');
+ * var element2 = document.querySelector('#id');
+ *
+ * For details about CSS selector syntax, see the
+ * [CSS selector specification](http://www.w3.org/TR/css3-selectors/).
+ */
+Element querySelector(String selectors) => document.querySelector(selectors);
+
+/**
+ * Finds all descendant elements of this document that match the specified
+ * group of selectors.
+ *
+ * Unless your webpage contains multiple documents, the top-level
+ * [querySelectorAll]
+ * method behaves the same as this method, so you should use it instead to
+ * save typing a few characters.
+ *
+ * [selectors] should be a string using CSS selector syntax.
+ *
+ * var items = document.querySelectorAll('.itemClassName');
+ *
+ * For details about CSS selector syntax, see the
+ * [CSS selector specification](http://www.w3.org/TR/css3-selectors/).
+ */
+ElementList<Element> querySelectorAll(String selectors) => document.querySelectorAll(selectors);
+
+/// A utility for changing the Dart wrapper type for elements.
+abstract class ElementUpgrader {
+ /// Upgrade the specified element to be of the Dart type this was created for.
+ ///
+ /// After upgrading the element passed in is invalid and the returned value
+ /// should be used instead.
+ Element upgrade(Element element);
+}
+// Copyright (c) 2013, 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.
+
+
+
+/**
+ * Interface used to validate that only accepted elements and attributes are
+ * allowed while parsing HTML strings into DOM nodes.
+ *
+ * In general, customization of validation behavior should be done via the
+ * [NodeValidatorBuilder] class to mitigate the chances of incorrectly
+ * implementing validation rules.
+ */
+abstract class NodeValidator {
+
+ /**
+ * Construct a default NodeValidator which only accepts whitelisted HTML5
+ * elements and attributes.
+ *
+ * If a uriPolicy is not specified then the default uriPolicy will be used.
+ */
+ factory NodeValidator({UriPolicy uriPolicy}) =>
+ new _Html5NodeValidator(uriPolicy: uriPolicy);
+
+ factory NodeValidator.throws(NodeValidator base) =>
+ new _ThrowsNodeValidator(base);
+
+ /**
+ * Returns true if the tagName is an accepted type.
+ */
+ bool allowsElement(Element element);
+
+ /**
+ * Returns true if the attribute is allowed.
+ *
+ * The attributeName parameter will always be in lowercase.
+ *
+ * See [allowsElement] for format of tagName.
+ */
+ bool allowsAttribute(Element element, String attributeName, String value);
+}
+
+/**
+ * Performs sanitization of a node tree after construction to ensure that it
+ * does not contain any disallowed elements or attributes.
+ *
+ * In general custom implementations of this class should not be necessary and
+ * all validation customization should be done in custom NodeValidators, but
+ * custom implementations of this class can be created to perform more complex
+ * tree sanitization.
+ */
+abstract class NodeTreeSanitizer {
+
+ /**
+ * Constructs a default tree sanitizer which will remove all elements and
+ * attributes which are not allowed by the provided validator.
+ */
+ factory NodeTreeSanitizer(NodeValidator validator) =>
+ new _ValidatingTreeSanitizer(validator);
+
+ /**
+ * Called with the root of the tree which is to be sanitized.
+ *
+ * This method needs to walk the entire tree and either remove elements and
+ * attributes which are not recognized as safe or throw an exception which
+ * will mark the entire tree as unsafe.
+ */
+ void sanitizeTree(Node node);
+
+ /**
+ * A sanitizer for trees that we trust. It does no validation and allows
+ * any elements. It is also more efficient, since it can pass the text
+ * directly through to the underlying APIs without creating a document
+ * fragment to be sanitized.
+ */
+ static const trusted = const _TrustedHtmlTreeSanitizer();
+}
+
+/**
+ * A sanitizer for trees that we trust. It does no validation and allows
+ * any elements.
+ */
+class _TrustedHtmlTreeSanitizer implements NodeTreeSanitizer {
+ const _TrustedHtmlTreeSanitizer();
+
+ sanitizeTree(Node node) {}
+}
+
+/**
+ * Defines the policy for what types of uris are allowed for particular
+ * attribute values.
+ *
+ * This can be used to provide custom rules such as allowing all http:// URIs
+ * for image attributes but only same-origin URIs for anchor tags.
+ */
+abstract class UriPolicy {
+ /**
+ * Constructs the default UriPolicy which is to only allow Uris to the same
+ * origin as the application was launched from.
+ *
+ * This will block all ftp: mailto: URIs. It will also block accessing
+ * https://example.com if the app is running from http://example.com.
+ */
+ factory UriPolicy() => new _SameOriginUriPolicy();
+
+ /**
+ * Checks if the uri is allowed on the specified attribute.
+ *
+ * The uri provided may or may not be a relative path.
+ */
+ bool allowsUri(String uri);
+}
+
+/**
+ * Allows URIs to the same origin as the current application was loaded from
+ * (such as https://example.com:80).
+ */
+class _SameOriginUriPolicy implements UriPolicy {
+ final AnchorElement _hiddenAnchor = new AnchorElement();
+ final Location _loc = window.location;
+
+ bool allowsUri(String uri) {
+ _hiddenAnchor.href = uri;
+ // IE leaves an empty hostname for same-origin URIs.
+ return (_hiddenAnchor.hostname == _loc.hostname &&
+ _hiddenAnchor.port == _loc.port &&
+ _hiddenAnchor.protocol == _loc.protocol) ||
+ (_hiddenAnchor.hostname == '' &&
+ _hiddenAnchor.port == '' &&
+ (_hiddenAnchor.protocol == ':' || _hiddenAnchor.protocol == ''));
+ }
+}
+
+
+class _ThrowsNodeValidator implements NodeValidator {
+ final NodeValidator validator;
+
+ _ThrowsNodeValidator(this.validator) {}
+
+ bool allowsElement(Element element) {
+ if (!validator.allowsElement(element)) {
+ throw new ArgumentError(Element._safeTagName(element));
+ }
+ return true;
+ }
+
+ bool allowsAttribute(Element element, String attributeName, String value) {
+ if (!validator.allowsAttribute(element, attributeName, value)) {
+ throw new ArgumentError('${Element._safeTagName(element)}[$attributeName="$value"]');
+ }
+ }
+}
+
+
+/**
+ * Standard tree sanitizer which validates a node tree against the provided
+ * validator and removes any nodes or attributes which are not allowed.
+ */
+class _ValidatingTreeSanitizer implements NodeTreeSanitizer {
+ NodeValidator validator;
+ _ValidatingTreeSanitizer(this.validator) {}
+
+ void sanitizeTree(Node node) {
+ void walk(Node node, Node parent) {
+ sanitizeNode(node, parent);
+
+ var child = node.lastChild;
+ while (child != null) {
+ // Child may be removed during the walk.
+ var nextChild = child.previousNode;
+ walk(child, node);
+ child = nextChild;
+ }
+ }
+ walk(node, null);
+ }
+
+ /// Aggressively try to remove node.
+ void _removeNode(Node node, Node parent) {
+ // If we have the parent, it's presumably already passed more sanitization
+ // or is the fragment, so ask it to remove the child. And if that fails
+ // try to set the outer html.
+ if (parent == null) {
+ node.remove();
+ } else {
+ parent._removeChild(node);
+ }
+ }
+
+ /// Sanitize the element, assuming we can't trust anything about it.
+ void _sanitizeUntrustedElement(/* Element */ element, Node parent) {
+ // If the _hasCorruptedAttributes does not successfully return false,
+ // then we consider it corrupted and remove.
+ // TODO(alanknight): This is a workaround because on Firefox
+ // embed/object
+ // tags typeof is "function", not "object". We don't recognize them, and
+ // can't call methods. This does mean that you can't explicitly allow an
+ // embed tag. The only thing that will let it through is a null
+ // sanitizer that doesn't traverse the tree at all. But sanitizing while
+ // allowing embeds seems quite unlikely. This is also the reason that we
+ // can't declare the type of element, as an embed won't pass any type
+ // check in dart2js.
+ var corrupted = true;
+ var attrs;
+ var isAttr;
+ try {
+ // If getting/indexing attributes throws, count that as corrupt.
+ attrs = element.attributes;
+ isAttr = attrs['is'];
+ var corruptedTest1 = Element._hasCorruptedAttributes(element);
+
+ // On IE, erratically, the hasCorruptedAttributes test can return false,
+ // even though it clearly is corrupted. A separate copy of the test
+ // inlining just the basic check seems to help.
+ corrupted = corruptedTest1 ? true : Element._hasCorruptedAttributesAdditionalCheck(element);
+ } catch(e) {}
+ var elementText = 'element unprintable';
+ try {
+ elementText = element.toString();
+ } catch(e) {}
+ try {
+ var elementTagName = Element._safeTagName(element);
+ _sanitizeElement(element, parent, corrupted, elementText, elementTagName,
+ attrs, isAttr);
+ } on ArgumentError { // Thrown by _ThrowsNodeValidator
+ rethrow;
+ } catch(e) { // Unexpected exception sanitizing -> remove
+ _removeNode(element, parent);
+ window.console.warn('Removing corrupted element $elementText');
+ }
+ }
+
+ /// Having done basic sanity checking on the element, and computed the
+ /// important attributes we want to check, remove it if it's not valid
+ /// or not allowed, either as a whole or particular attributes.
+ void _sanitizeElement(Element element, Node parent, bool corrupted,
+ String text, String tag, Map attrs, String isAttr) {
+ if (false != corrupted) {
+ _removeNode(element, parent);
+ window.console.warn(
+ 'Removing element due to corrupted attributes on <$text>');
+ return;
+ }
+ if (!validator.allowsElement(element)) {
+ _removeNode(element, parent);
+ window.console.warn(
+ 'Removing disallowed element <$tag> from $parent');
+ return;
+ }
+
+ if (isAttr != null) {
+ if (!validator.allowsAttribute(element, 'is', isAttr)) {
+ _removeNode(element, parent);
+ window.console.warn('Removing disallowed type extension '
+ '<$tag is="$isAttr">');
+ return;
+ }
+ }
+
+ // TODO(blois): Need to be able to get all attributes, irrespective of
+ // XMLNS.
+ var keys = attrs.keys.toList();
+ for (var i = attrs.length - 1; i >= 0; --i) {
+ var name = keys[i];
+ if (!validator.allowsAttribute(element, name.toLowerCase(),
+ attrs[name])) {
+ window.console.warn('Removing disallowed attribute '
+ '<$tag $name="${attrs[name]}">');
+ attrs.remove(name);
+ }
+ }
+
+ if (element is TemplateElement) {
+ TemplateElement template = element;
+ sanitizeTree(template.content);
+ }
+ }
+
+ /// Sanitize the node and its children recursively.
+ void sanitizeNode(Node node, Node parent) {
+ switch (node.nodeType) {
+ case Node.ELEMENT_NODE:
+ _sanitizeUntrustedElement(node, parent);
+ break;
+ case Node.COMMENT_NODE:
+ case Node.DOCUMENT_FRAGMENT_NODE:
+ case Node.TEXT_NODE:
+ case Node.CDATA_SECTION_NODE:
+ break;
+ default:
+ _removeNode(node, parent);
+ }
+ }
+}
+// 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.
+
+// DO NOT EDIT - unless you are editing documentation as per:
+// https://code.google.com/p/dart/wiki/ContributingHTMLDocumentation
+// Auto-generated dart:html library.
+
+
+import 'dart:_js_helper' show
+ convertDartClosureToJS, Creates, JavaScriptIndexingBehavior,
+ JSName, Native, Returns, ForceInline,
+ findDispatchTagForInterceptorClass, setNativeSubclassDispatchRecord,
+ makeLeafDispatchRecord;
+import 'dart:_interceptors' show
+ Interceptor, JSExtendableArray, JSUInt31,
+ findInterceptorConstructorForType,
+ findConstructorForNativeSubclassType,
+ getNativeInterceptor,
+ setDispatchProperty;
+
+export 'dart:math' show Rectangle, Point;
+
+
+
+//part '../../../dom/src/dart2js_CustomElementSupport.dart';
+
+
+/**
+ * Top-level container for a web page, which is usually a browser tab or window.
+ *
+ * Each web page loaded in the browser has its own [Window], which is a
+ * container for the web page.
+ *
+ * If the web page has any `<iframe>` elements, then each `<iframe>` has its own
+ * [Window] object, which is accessible only to that `<iframe>`.
+ *
+ * See also:
+ *
+ * * [Window](https://developer.mozilla.org/en-US/docs/Web/API/window) from MDN.
+ */
+Window get window => wrap_jso(JS('', 'window'));
+
+/**
+ * Root node for all content in a web page.
+ */
+HtmlDocument get document => wrap_jso(JS('HtmlDocument', 'document'));
+
+// Workaround for tags like <cite> that lack their own Element subclass --
+// Dart issue 1990.
+@Native("HTMLElement")
+class HtmlElement extends Element {
+ factory HtmlElement() { throw new UnsupportedError("Not supported"); }
+
+ /**
+ * Constructor instantiated by the DOM when a custom element has been created.
+ *
+ * This can only be called by subclasses from their created constructor.
+ */
+ HtmlElement.created() : super.created();
+ HtmlElement.internal_() : super.internal_();
+
+ static HtmlElement internalCreateHtmlElement() {
+ return new HtmlElement._internalWrap();
+ }
+
+ factory HtmlElement._internalWrap() {
+ return new HtmlElement.internal_();
+ }
+}
+
+// EntryArray type was removed, so explicitly adding it to allow support for
+// older Chrome versions.
+// Issue #12573.
+@Native("EntryArray")
+abstract class _EntryArray implements List<Entry> {}
+
+/**
+ * Spawn a DOM isolate using the given URI in the same window.
+ * This isolate is not concurrent. It runs on the browser thread
+ * with full access to the DOM.
+ * Note: this API is still evolving and may move to dart:isolate.
+ */
+@Experimental()
+Future<Isolate> spawnDomUri(Uri uri, List<String> args, message) {
+ // TODO(17738): Implement this.
+ throw new UnimplementedError();
+}
+
+
+class DartHtmlDomObject {
+ // FIXME(vsm): Make this final at least. Private?
+ dynamic raw;
+
+ DartHtmlDomObject();
+ DartHtmlDomObject.internal_();
+}
+
+typedef _F1(x);
+
+final _wrapper = JS('', 'Symbol("dart_wrapper")');
+
+/// Dartium functions that are a NOOP in dart2js.
+unwrap_jso(wrapped) {
+ if (wrapped is DartHtmlDomObject) {
+ return wrapped.raw;
+ }
+ if (wrapped is _F1) {
+ if (JS('bool', '#.hasOwnProperty(#)', wrapped, _wrapper)) {
+ return JS('', '#[#]', wrapped, _wrapper);
+ }
+ var f = (e) => wrapped(wrap_jso(e));
+ JS('', '#[#] = #', wrapped, _wrapper, f);
+ return f;
+ }
+ return wrapped;
+}
+
+
+wrap_jso(jso) {
+ if (jso == null || jso is bool || jso is num || jso is String) {
+ return jso;
+ }
+ if (JS('bool', '#.hasOwnProperty(#)', jso, _wrapper)) {
+ return JS('', '#[#]', jso, _wrapper);
+ }
+ var constructor = JS('', '#.constructor', jso)
+ var f = null;
+ String name;
+ bool skip = false;
+ while (f == null) {
+ name = JS('String', '#.name', constructor);
+ f = getHtmlCreateFunction(name);
+ if (f == null) {
+ console.error('Could not instantiate $name');
+ skip = true;
+ constructor = JS('', '#.__proto__', constructor);
+ }
+ }
+ if (skip) {
+ console.info('Instantiated $name instead');
+ }
+ var wrapped = f();
+ wrapped.raw = jso;
+ JS('', '#[#] = #', jso, _wrapper, wrapped);
+ return wrapped;
+}
+
+createCustomUpgrader(Type customElementClass, $this) => $this;
+
+// FIXME: Can we make this private?
+final htmlBlinkMap = {
+ '_HistoryCrossFrame': () => _HistoryCrossFrame,
+ '_LocationCrossFrame': () => _LocationCrossFrame,
+ '_DOMWindowCrossFrame': () => _DOMWindowCrossFrame,
+ // FIXME: Move these to better locations.
+ 'DateTime': () => DateTime,
+ 'JsObject': () => js.JsObjectImpl,
+ 'JsFunction': () => js.JsFunctionImpl,
+ 'JsArray': () => js.JsArrayImpl,
+ 'Attr': () => _Attr,
+ 'CSSStyleDeclaration': () => CssStyleDeclaration,
+ 'CharacterData': () => CharacterData,
+ 'ChildNode': () => ChildNode,
+ 'ClientRect': () => _ClientRect,
+ 'Console': () => Console,
+ 'ConsoleBase': () => ConsoleBase,
+ 'DOMImplementation': () => DomImplementation,
+ 'DOMTokenList': () => DomTokenList,
+ 'Document': () => Document,
+ 'DocumentFragment': () => DocumentFragment,
+ 'Element': () => Element,
+ 'Event': () => Event,
+ 'EventTarget': () => EventTarget,
+ 'HTMLAnchorElement': () => AnchorElement,
+ 'HTMLBaseElement': () => BaseElement,
+ 'HTMLBodyElement': () => BodyElement,
+ 'HTMLCollection': () => HtmlCollection,
+ 'HTMLDivElement': () => DivElement,
+ 'HTMLDocument': () => HtmlDocument,
+ 'HTMLElement': () => HtmlElement,
+ 'HTMLHeadElement': () => HeadElement,
+ 'HTMLInputElement': () => InputElement,
+ 'HTMLStyleElement': () => StyleElement,
+ 'HTMLTemplateElement': () => TemplateElement,
+ 'History': () => History,
+ 'KeyboardEvent': () => KeyboardEvent,
+ 'Location': () => Location,
+ 'MouseEvent': () => MouseEvent,
+ 'NamedNodeMap': () => _NamedNodeMap,
+ 'Navigator': () => Navigator,
+ 'NavigatorCPU': () => NavigatorCpu,
+ 'Node': () => Node,
+ 'NodeList': () => NodeList,
+ 'ParentNode': () => ParentNode,
+ 'ProgressEvent': () => ProgressEvent,
+ 'Range': () => Range,
+ 'ShadowRoot': () => ShadowRoot,
+ 'Text': () => Text,
+ 'UIEvent': () => UIEvent,
+ 'URLUtils': () => UrlUtils,
+ 'Window': () => Window,
+ 'XMLHttpRequest': () => HttpRequest,
+ 'XMLHttpRequestEventTarget': () => HttpRequestEventTarget,
+ 'XMLHttpRequestProgressEvent': () => _XMLHttpRequestProgressEvent,
+
+};
+
+// FIXME: Can we make this private?
+final htmlBlinkFunctionMap = {
+ 'Attr': () => _Attr.internalCreate_Attr,
+ 'CSSStyleDeclaration': () => CssStyleDeclaration.internalCreateCssStyleDeclaration,
+ 'CharacterData': () => CharacterData.internalCreateCharacterData,
+ 'ClientRect': () => _ClientRect.internalCreate_ClientRect,
+ 'Console': () => Console.internalCreateConsole,
+ 'ConsoleBase': () => ConsoleBase.internalCreateConsoleBase,
+ 'DOMImplementation': () => DomImplementation.internalCreateDomImplementation,
+ 'DOMTokenList': () => DomTokenList.internalCreateDomTokenList,
+ 'Document': () => Document.internalCreateDocument,
+ 'DocumentFragment': () => DocumentFragment.internalCreateDocumentFragment,
+ 'Element': () => Element.internalCreateElement,
+ 'Event': () => Event.internalCreateEvent,
+ 'EventTarget': () => EventTarget.internalCreateEventTarget,
+ 'HTMLAnchorElement': () => AnchorElement.internalCreateAnchorElement,
+ 'HTMLBaseElement': () => BaseElement.internalCreateBaseElement,
+ 'HTMLBodyElement': () => BodyElement.internalCreateBodyElement,
+ 'HTMLCollection': () => HtmlCollection.internalCreateHtmlCollection,
+ 'HTMLDivElement': () => DivElement.internalCreateDivElement,
+ 'HTMLDocument': () => HtmlDocument.internalCreateHtmlDocument,
+ 'HTMLElement': () => HtmlElement.internalCreateHtmlElement,
+ 'HTMLHeadElement': () => HeadElement.internalCreateHeadElement,
+ 'HTMLInputElement': () => InputElement.internalCreateInputElement,
+ 'HTMLStyleElement': () => StyleElement.internalCreateStyleElement,
+ 'HTMLTemplateElement': () => TemplateElement.internalCreateTemplateElement,
+ 'History': () => History.internalCreateHistory,
+ 'KeyboardEvent': () => KeyboardEvent.internalCreateKeyboardEvent,
+ 'Location': () => Location.internalCreateLocation,
+ 'MouseEvent': () => MouseEvent.internalCreateMouseEvent,
+ 'NamedNodeMap': () => _NamedNodeMap.internalCreate_NamedNodeMap,
+ 'Navigator': () => Navigator.internalCreateNavigator,
+ 'Node': () => Node.internalCreateNode,
+ 'NodeList': () => NodeList.internalCreateNodeList,
+ 'ProgressEvent': () => ProgressEvent.internalCreateProgressEvent,
+ 'Range': () => Range.internalCreateRange,
+ 'ShadowRoot': () => ShadowRoot.internalCreateShadowRoot,
+ 'Text': () => Text.internalCreateText,
+ 'UIEvent': () => UIEvent.internalCreateUIEvent,
+ 'Window': () => Window.internalCreateWindow,
+ 'XMLHttpRequest': () => HttpRequest.internalCreateHttpRequest,
+ 'XMLHttpRequestEventTarget': () => HttpRequestEventTarget.internalCreateHttpRequestEventTarget,
+ 'XMLHttpRequestProgressEvent': () => _XMLHttpRequestProgressEvent.internalCreate_XMLHttpRequestProgressEvent,
+
+};
+
+// TODO(terry): We may want to move this elsewhere if html becomes
+// a package to avoid dartium depending on pkg:html.
+getHtmlCreateFunction(String key) {
+ var result;
+
+ // TODO(vsm): Add Cross Frame and JS types here as well.
+
+ // Check the html library.
+ result = _getHtmlFunction(key);
+ if (result != null) {
+ return result;
+ }
+ return null;
+}
+
+Function _getHtmlFunction(String key) {
+ if (htmlBlinkFunctionMap.containsKey(key)) {
+ return htmlBlinkFunctionMap[key]();
+ }
+ return null;
+}
+
« no previous file with comments | « tool/input_sdk/lib/_internal/libraries.dart ('k') | tool/input_sdk/lib/html/html_common/conversions.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698