/// The Dart HTML library.
library dart.dom.html;

import 'dart:async';
import 'dart:collection';
import 'dart:html_common';
import 'dart:indexed_db';
import 'dart:isolate';
import 'dart:json' as json;
import 'dart:math';
import 'dart:nativewrappers';
import 'dart:typeddata' as _typeddata;
import 'dart:web_sql';
import 'dart:svg' as svg;
import 'dart:web_audio' as web_audio;
// 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
// Auto-generated dart:html library.


// Not actually used, but imported since dart:html can generate these objects.





Window _window;

Window get window {
  if (_window != null) {
    return _window;
  }
  _window = _Utils.window();
  return _window;
}

HtmlDocument _document;

HtmlDocument get document {
  if (_document != null) {
    return _document;
  }
  _document = window.document;
  return _document;
}


Element query(String selector) => document.query(selector);
List<Element> queryAll(String selector) => document.queryAll(selector);

int _getNewIsolateId() => _Utils._getNewIsolateId();

bool _callPortInitialized = false;
var _callPortLastResult = null;

_callPortSync(num id, var message) {
  if (!_callPortInitialized) {
    window.on['js-result'].listen((event) {
      _callPortLastResult = json.parse(_getPortSyncEventData(event));
    });
    _callPortInitialized = true;
  }
  assert(_callPortLastResult == null);
  _dispatchEvent('js-sync-message', {'id': id, 'message': message});
  var result = _callPortLastResult;
  _callPortLastResult = null;
  return result;
}
// 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.


@DocsEditable
@DomName('AbstractWorker')
class AbstractWorker extends EventTarget {
  AbstractWorker.internal() : super.internal();

  @DomName('AbstractWorker.errorEvent')
  @DocsEditable
  static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');

  @DomName('AbstractWorker.addEventListener')
  @DocsEditable
  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "AbstractWorker_addEventListener_Callback";

  @DomName('AbstractWorker.dispatchEvent')
  @DocsEditable
  bool dispatchEvent(Event evt) native "AbstractWorker_dispatchEvent_Callback";

  @DomName('AbstractWorker.removeEventListener')
  @DocsEditable
  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "AbstractWorker_removeEventListener_Callback";

  @DomName('AbstractWorker.onerror')
  @DocsEditable
  Stream<Event> get onError => errorEvent.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.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('HTMLAnchorElement')
class AnchorElement extends _Element_Merged {
  AnchorElement.internal() : super.internal();

  @DomName('HTMLAnchorElement.HTMLAnchorElement')
  @DocsEditable
  factory AnchorElement({String href}) {
    var e = document.$dom_createElement("a");
    if (href != null) e.href = href;
    return e;
  }

  @DomName('HTMLAnchorElement.download')
  @DocsEditable
  String get download native "HTMLAnchorElement_download_Getter";

  @DomName('HTMLAnchorElement.download')
  @DocsEditable
  void set download(String value) native "HTMLAnchorElement_download_Setter";

  @DomName('HTMLAnchorElement.hash')
  @DocsEditable
  String get hash native "HTMLAnchorElement_hash_Getter";

  @DomName('HTMLAnchorElement.hash')
  @DocsEditable
  void set hash(String value) native "HTMLAnchorElement_hash_Setter";

  @DomName('HTMLAnchorElement.host')
  @DocsEditable
  String get host native "HTMLAnchorElement_host_Getter";

  @DomName('HTMLAnchorElement.host')
  @DocsEditable
  void set host(String value) native "HTMLAnchorElement_host_Setter";

  @DomName('HTMLAnchorElement.hostname')
  @DocsEditable
  String get hostname native "HTMLAnchorElement_hostname_Getter";

  @DomName('HTMLAnchorElement.hostname')
  @DocsEditable
  void set hostname(String value) native "HTMLAnchorElement_hostname_Setter";

  @DomName('HTMLAnchorElement.href')
  @DocsEditable
  String get href native "HTMLAnchorElement_href_Getter";

  @DomName('HTMLAnchorElement.href')
  @DocsEditable
  void set href(String value) native "HTMLAnchorElement_href_Setter";

  @DomName('HTMLAnchorElement.hreflang')
  @DocsEditable
  String get hreflang native "HTMLAnchorElement_hreflang_Getter";

  @DomName('HTMLAnchorElement.hreflang')
  @DocsEditable
  void set hreflang(String value) native "HTMLAnchorElement_hreflang_Setter";

  @DomName('HTMLAnchorElement.name')
  @DocsEditable
  String get name native "HTMLAnchorElement_name_Getter";

  @DomName('HTMLAnchorElement.name')
  @DocsEditable
  void set name(String value) native "HTMLAnchorElement_name_Setter";

  @DomName('HTMLAnchorElement.origin')
  @DocsEditable
  String get origin native "HTMLAnchorElement_origin_Getter";

  @DomName('HTMLAnchorElement.pathname')
  @DocsEditable
  String get pathname native "HTMLAnchorElement_pathname_Getter";

  @DomName('HTMLAnchorElement.pathname')
  @DocsEditable
  void set pathname(String value) native "HTMLAnchorElement_pathname_Setter";

  @DomName('HTMLAnchorElement.ping')
  @DocsEditable
  String get ping native "HTMLAnchorElement_ping_Getter";

  @DomName('HTMLAnchorElement.ping')
  @DocsEditable
  void set ping(String value) native "HTMLAnchorElement_ping_Setter";

  @DomName('HTMLAnchorElement.port')
  @DocsEditable
  String get port native "HTMLAnchorElement_port_Getter";

  @DomName('HTMLAnchorElement.port')
  @DocsEditable
  void set port(String value) native "HTMLAnchorElement_port_Setter";

  @DomName('HTMLAnchorElement.protocol')
  @DocsEditable
  String get protocol native "HTMLAnchorElement_protocol_Getter";

  @DomName('HTMLAnchorElement.protocol')
  @DocsEditable
  void set protocol(String value) native "HTMLAnchorElement_protocol_Setter";

  @DomName('HTMLAnchorElement.rel')
  @DocsEditable
  String get rel native "HTMLAnchorElement_rel_Getter";

  @DomName('HTMLAnchorElement.rel')
  @DocsEditable
  void set rel(String value) native "HTMLAnchorElement_rel_Setter";

  @DomName('HTMLAnchorElement.search')
  @DocsEditable
  String get search native "HTMLAnchorElement_search_Getter";

  @DomName('HTMLAnchorElement.search')
  @DocsEditable
  void set search(String value) native "HTMLAnchorElement_search_Setter";

  @DomName('HTMLAnchorElement.target')
  @DocsEditable
  String get target native "HTMLAnchorElement_target_Getter";

  @DomName('HTMLAnchorElement.target')
  @DocsEditable
  void set target(String value) native "HTMLAnchorElement_target_Setter";

  @DomName('HTMLAnchorElement.type')
  @DocsEditable
  String get type native "HTMLAnchorElement_type_Getter";

  @DomName('HTMLAnchorElement.type')
  @DocsEditable
  void set type(String value) native "HTMLAnchorElement_type_Setter";

  @DomName('HTMLAnchorElement.toString')
  @DocsEditable
  String toString() native "HTMLAnchorElement_toString_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('WebKitAnimationEvent')
class AnimationEvent extends Event {
  AnimationEvent.internal() : super.internal();

  @DomName('WebKitAnimationEvent.animationName')
  @DocsEditable
  String get animationName native "WebKitAnimationEvent_animationName_Getter";

  @DomName('WebKitAnimationEvent.elapsedTime')
  @DocsEditable
  num get elapsedTime native "WebKitAnimationEvent_elapsedTime_Getter";

}
// 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.


@DocsEditable
@DomName('DOMApplicationCache')
@SupportedBrowser(SupportedBrowser.CHROME)
@SupportedBrowser(SupportedBrowser.FIREFOX)
@SupportedBrowser(SupportedBrowser.IE, '10')
@SupportedBrowser(SupportedBrowser.OPERA)
@SupportedBrowser(SupportedBrowser.SAFARI)
class ApplicationCache extends EventTarget {
  ApplicationCache.internal() : super.internal();

  @DomName('DOMApplicationCache.cachedEvent')
  @DocsEditable
  static const EventStreamProvider<Event> cachedEvent = const EventStreamProvider<Event>('cached');

  @DomName('DOMApplicationCache.checkingEvent')
  @DocsEditable
  static const EventStreamProvider<Event> checkingEvent = const EventStreamProvider<Event>('checking');

  @DomName('DOMApplicationCache.downloadingEvent')
  @DocsEditable
  static const EventStreamProvider<Event> downloadingEvent = const EventStreamProvider<Event>('downloading');

  @DomName('DOMApplicationCache.errorEvent')
  @DocsEditable
  static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');

  @DomName('DOMApplicationCache.noupdateEvent')
  @DocsEditable
  static const EventStreamProvider<Event> noUpdateEvent = const EventStreamProvider<Event>('noupdate');

  @DomName('DOMApplicationCache.obsoleteEvent')
  @DocsEditable
  static const EventStreamProvider<Event> obsoleteEvent = const EventStreamProvider<Event>('obsolete');

  @DomName('DOMApplicationCache.progressEvent')
  @DocsEditable
  static const EventStreamProvider<Event> progressEvent = const EventStreamProvider<Event>('progress');

  @DomName('DOMApplicationCache.updatereadyEvent')
  @DocsEditable
  static const EventStreamProvider<Event> updateReadyEvent = const EventStreamProvider<Event>('updateready');

  /// Checks if this type is supported on the current platform.
  static bool get supported => true;

  static const int CHECKING = 2;

  static const int DOWNLOADING = 3;

  static const int IDLE = 1;

  static const int OBSOLETE = 5;

  static const int UNCACHED = 0;

  static const int UPDATEREADY = 4;

  @DomName('DOMApplicationCache.status')
  @DocsEditable
  int get status native "DOMApplicationCache_status_Getter";

  @DomName('DOMApplicationCache.abort')
  @DocsEditable
  void abort() native "DOMApplicationCache_abort_Callback";

  @DomName('DOMApplicationCache.addEventListener')
  @DocsEditable
  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "DOMApplicationCache_addEventListener_Callback";

  @DomName('DOMApplicationCache.dispatchEvent')
  @DocsEditable
  bool dispatchEvent(Event evt) native "DOMApplicationCache_dispatchEvent_Callback";

  @DomName('DOMApplicationCache.removeEventListener')
  @DocsEditable
  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "DOMApplicationCache_removeEventListener_Callback";

  @DomName('DOMApplicationCache.swapCache')
  @DocsEditable
  void swapCache() native "DOMApplicationCache_swapCache_Callback";

  @DomName('DOMApplicationCache.update')
  @DocsEditable
  void update() native "DOMApplicationCache_update_Callback";

  @DomName('DOMApplicationCache.oncached')
  @DocsEditable
  Stream<Event> get onCached => cachedEvent.forTarget(this);

  @DomName('DOMApplicationCache.onchecking')
  @DocsEditable
  Stream<Event> get onChecking => checkingEvent.forTarget(this);

  @DomName('DOMApplicationCache.ondownloading')
  @DocsEditable
  Stream<Event> get onDownloading => downloadingEvent.forTarget(this);

  @DomName('DOMApplicationCache.onerror')
  @DocsEditable
  Stream<Event> get onError => errorEvent.forTarget(this);

  @DomName('DOMApplicationCache.onnoupdate')
  @DocsEditable
  Stream<Event> get onNoUpdate => noUpdateEvent.forTarget(this);

  @DomName('DOMApplicationCache.onobsolete')
  @DocsEditable
  Stream<Event> get onObsolete => obsoleteEvent.forTarget(this);

  @DomName('DOMApplicationCache.onprogress')
  @DocsEditable
  Stream<Event> get onProgress => progressEvent.forTarget(this);

  @DomName('DOMApplicationCache.onupdateready')
  @DocsEditable
  Stream<Event> get onUpdateReady => updateReadyEvent.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.

// WARNING: Do not edit - generated code.


@DocsEditable
/**
 * DOM Area Element, which links regions of an image map with a hyperlink.
 *
 * The element can also define an uninteractive region of the map.
 *
 * See also:
 *
 * * [<area>](https://developer.mozilla.org/en-US/docs/HTML/Element/area)
 * on MDN.
 */
@DomName('HTMLAreaElement')
class AreaElement extends _Element_Merged {
  AreaElement.internal() : super.internal();

  @DomName('HTMLAreaElement.HTMLAreaElement')
  @DocsEditable
  factory AreaElement() => document.$dom_createElement("area");

  @DomName('HTMLAreaElement.alt')
  @DocsEditable
  String get alt native "HTMLAreaElement_alt_Getter";

  @DomName('HTMLAreaElement.alt')
  @DocsEditable
  void set alt(String value) native "HTMLAreaElement_alt_Setter";

  @DomName('HTMLAreaElement.coords')
  @DocsEditable
  String get coords native "HTMLAreaElement_coords_Getter";

  @DomName('HTMLAreaElement.coords')
  @DocsEditable
  void set coords(String value) native "HTMLAreaElement_coords_Setter";

  @DomName('HTMLAreaElement.hash')
  @DocsEditable
  String get hash native "HTMLAreaElement_hash_Getter";

  @DomName('HTMLAreaElement.host')
  @DocsEditable
  String get host native "HTMLAreaElement_host_Getter";

  @DomName('HTMLAreaElement.hostname')
  @DocsEditable
  String get hostname native "HTMLAreaElement_hostname_Getter";

  @DomName('HTMLAreaElement.href')
  @DocsEditable
  String get href native "HTMLAreaElement_href_Getter";

  @DomName('HTMLAreaElement.href')
  @DocsEditable
  void set href(String value) native "HTMLAreaElement_href_Setter";

  @DomName('HTMLAreaElement.pathname')
  @DocsEditable
  String get pathname native "HTMLAreaElement_pathname_Getter";

  @DomName('HTMLAreaElement.ping')
  @DocsEditable
  String get ping native "HTMLAreaElement_ping_Getter";

  @DomName('HTMLAreaElement.ping')
  @DocsEditable
  void set ping(String value) native "HTMLAreaElement_ping_Setter";

  @DomName('HTMLAreaElement.port')
  @DocsEditable
  String get port native "HTMLAreaElement_port_Getter";

  @DomName('HTMLAreaElement.protocol')
  @DocsEditable
  String get protocol native "HTMLAreaElement_protocol_Getter";

  @DomName('HTMLAreaElement.search')
  @DocsEditable
  String get search native "HTMLAreaElement_search_Getter";

  @DomName('HTMLAreaElement.shape')
  @DocsEditable
  String get shape native "HTMLAreaElement_shape_Getter";

  @DomName('HTMLAreaElement.shape')
  @DocsEditable
  void set shape(String value) native "HTMLAreaElement_shape_Setter";

  @DomName('HTMLAreaElement.target')
  @DocsEditable
  String get target native "HTMLAreaElement_target_Getter";

  @DomName('HTMLAreaElement.target')
  @DocsEditable
  void set target(String value) native "HTMLAreaElement_target_Setter";

}
// 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.


@DocsEditable
@DomName('ArrayBuffer')
@SupportedBrowser(SupportedBrowser.CHROME)
@SupportedBrowser(SupportedBrowser.FIREFOX)
@SupportedBrowser(SupportedBrowser.IE, '10')
@SupportedBrowser(SupportedBrowser.SAFARI)
class ArrayBuffer extends NativeFieldWrapperClass1 {
  ArrayBuffer.internal();
  factory ArrayBuffer(int length) => _create(length);

  @DocsEditable
  static ArrayBuffer _create(length) native "ArrayBuffer_constructorCallback";

  /// Checks if this type is supported on the current platform.
  static bool get supported => true;

  @DomName('ArrayBuffer.byteLength')
  @DocsEditable
  int get byteLength native "ArrayBuffer_byteLength_Getter";

  dynamic slice(int begin, [int end]) {
    if (?end) {
      return _slice_1(begin, end);
    }
    return _slice_2(begin);
  }

  @DomName('ArrayBuffer._slice_1')
  @DocsEditable
  dynamic _slice_1(begin, end) native "ArrayBuffer__slice_1_Callback";

  @DomName('ArrayBuffer._slice_2')
  @DocsEditable
  dynamic _slice_2(begin) native "ArrayBuffer__slice_2_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('ArrayBufferView')
@SupportedBrowser(SupportedBrowser.CHROME)
@SupportedBrowser(SupportedBrowser.FIREFOX)
@SupportedBrowser(SupportedBrowser.IE, '10')
@SupportedBrowser(SupportedBrowser.SAFARI)
class ArrayBufferView extends NativeFieldWrapperClass1 {
  ArrayBufferView.internal();

  @DomName('ArrayBufferView.buffer')
  @DocsEditable
  dynamic get buffer native "ArrayBufferView_buffer_Getter";

  @DomName('ArrayBufferView.byteLength')
  @DocsEditable
  int get byteLength native "ArrayBufferView_byteLength_Getter";

  @DomName('ArrayBufferView.byteOffset')
  @DocsEditable
  int get byteOffset native "ArrayBufferView_byteOffset_Getter";

}
// 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.


@DocsEditable
@DomName('Attr')
class Attr extends Node {
  Attr.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.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('HTMLAudioElement')
class AudioElement extends MediaElement {
  AudioElement.internal() : super.internal();

  @DomName('HTMLAudioElement.HTMLAudioElement')
  @DocsEditable
  factory AudioElement([String src]) {
    return AudioElement._create_1(src);
  }

  @DocsEditable
  static AudioElement _create_1(src) native "HTMLAudioElement__create_1constructorCallback";

}
// 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.


@DocsEditable
@DomName('HTMLBRElement')
class BRElement extends _Element_Merged {
  BRElement.internal() : super.internal();

  @DomName('HTMLBRElement.HTMLBRElement')
  @DocsEditable
  factory BRElement() => document.$dom_createElement("br");

}
// 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.


@DocsEditable
@DomName('BarInfo')
class BarInfo extends NativeFieldWrapperClass1 {
  BarInfo.internal();

  @DomName('BarInfo.visible')
  @DocsEditable
  bool get visible native "BarInfo_visible_Getter";

}
// 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.


@DocsEditable
@DomName('HTMLBaseElement')
class BaseElement extends _Element_Merged {
  BaseElement.internal() : super.internal();

  @DomName('HTMLBaseElement.HTMLBaseElement')
  @DocsEditable
  factory BaseElement() => document.$dom_createElement("base");

  @DomName('HTMLBaseElement.href')
  @DocsEditable
  String get href native "HTMLBaseElement_href_Getter";

  @DomName('HTMLBaseElement.href')
  @DocsEditable
  void set href(String value) native "HTMLBaseElement_href_Setter";

  @DomName('HTMLBaseElement.target')
  @DocsEditable
  String get target native "HTMLBaseElement_target_Getter";

  @DomName('HTMLBaseElement.target')
  @DocsEditable
  void set target(String value) native "HTMLBaseElement_target_Setter";

}
// 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.


@DocsEditable
@DomName('BatteryManager')
class BatteryManager extends EventTarget {
  BatteryManager.internal() : super.internal();

  @DomName('BatteryManager.chargingchangeEvent')
  @DocsEditable
  static const EventStreamProvider<Event> chargingChangeEvent = const EventStreamProvider<Event>('chargingchange');

  @DomName('BatteryManager.chargingtimechangeEvent')
  @DocsEditable
  static const EventStreamProvider<Event> chargingTimeChangeEvent = const EventStreamProvider<Event>('chargingtimechange');

  @DomName('BatteryManager.dischargingtimechangeEvent')
  @DocsEditable
  static const EventStreamProvider<Event> dischargingTimeChangeEvent = const EventStreamProvider<Event>('dischargingtimechange');

  @DomName('BatteryManager.levelchangeEvent')
  @DocsEditable
  static const EventStreamProvider<Event> levelChangeEvent = const EventStreamProvider<Event>('levelchange');

  @DomName('BatteryManager.charging')
  @DocsEditable
  bool get charging native "BatteryManager_charging_Getter";

  @DomName('BatteryManager.chargingTime')
  @DocsEditable
  num get chargingTime native "BatteryManager_chargingTime_Getter";

  @DomName('BatteryManager.dischargingTime')
  @DocsEditable
  num get dischargingTime native "BatteryManager_dischargingTime_Getter";

  @DomName('BatteryManager.level')
  @DocsEditable
  num get level native "BatteryManager_level_Getter";

  @DomName('BatteryManager.addEventListener')
  @DocsEditable
  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "BatteryManager_addEventListener_Callback";

  @DomName('BatteryManager.dispatchEvent')
  @DocsEditable
  bool dispatchEvent(Event event) native "BatteryManager_dispatchEvent_Callback";

  @DomName('BatteryManager.removeEventListener')
  @DocsEditable
  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "BatteryManager_removeEventListener_Callback";

  @DomName('BatteryManager.onchargingchange')
  @DocsEditable
  Stream<Event> get onChargingChange => chargingChangeEvent.forTarget(this);

  @DomName('BatteryManager.onchargingtimechange')
  @DocsEditable
  Stream<Event> get onChargingTimeChange => chargingTimeChangeEvent.forTarget(this);

  @DomName('BatteryManager.ondischargingtimechange')
  @DocsEditable
  Stream<Event> get onDischargingTimeChange => dischargingTimeChangeEvent.forTarget(this);

  @DomName('BatteryManager.onlevelchange')
  @DocsEditable
  Stream<Event> get onLevelChange => levelChangeEvent.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.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('BeforeLoadEvent')
class BeforeLoadEvent extends Event {
  BeforeLoadEvent.internal() : super.internal();

  @DomName('BeforeLoadEvent.url')
  @DocsEditable
  String get url native "BeforeLoadEvent_url_Getter";

}
// 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('Blob')
class Blob extends NativeFieldWrapperClass1 {
  Blob.internal();
  factory Blob(List blobParts, [String type, String endings]) => _create(blobParts, type, endings);

  @DocsEditable
  static Blob _create(blobParts, type, endings) native "Blob_constructorCallback";

  @DomName('Blob.size')
  @DocsEditable
  int get size native "Blob_size_Getter";

  @DomName('Blob.type')
  @DocsEditable
  String get type native "Blob_type_Getter";

  Blob slice([int start, int end, String contentType]) {
    if (?contentType) {
      return _slice_1(start, end, contentType);
    }
    if (?end) {
      return _slice_2(start, end);
    }
    if (?start) {
      return _slice_3(start);
    }
    return _slice_4();
  }

  @DomName('Blob._slice_1')
  @DocsEditable
  Blob _slice_1(start, end, contentType) native "Blob__slice_1_Callback";

  @DomName('Blob._slice_2')
  @DocsEditable
  Blob _slice_2(start, end) native "Blob__slice_2_Callback";

  @DomName('Blob._slice_3')
  @DocsEditable
  Blob _slice_3(start) native "Blob__slice_3_Callback";

  @DomName('Blob._slice_4')
  @DocsEditable
  Blob _slice_4() native "Blob__slice_4_Callback";

}

// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('HTMLBodyElement')
class BodyElement extends _Element_Merged {
  BodyElement.internal() : super.internal();

  @DomName('HTMLBodyElement.beforeunloadEvent')
  @DocsEditable
  static const EventStreamProvider<Event> beforeUnloadEvent = const EventStreamProvider<Event>('beforeunload');

  @DomName('HTMLBodyElement.blurEvent')
  @DocsEditable
  static const EventStreamProvider<Event> blurEvent = const EventStreamProvider<Event>('blur');

  @DomName('HTMLBodyElement.errorEvent')
  @DocsEditable
  static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');

  @DomName('HTMLBodyElement.focusEvent')
  @DocsEditable
  static const EventStreamProvider<Event> focusEvent = const EventStreamProvider<Event>('focus');

  @DomName('HTMLBodyElement.hashchangeEvent')
  @DocsEditable
  static const EventStreamProvider<Event> hashChangeEvent = const EventStreamProvider<Event>('hashchange');

  @DomName('HTMLBodyElement.loadEvent')
  @DocsEditable
  static const EventStreamProvider<Event> loadEvent = const EventStreamProvider<Event>('load');

  @DomName('HTMLBodyElement.messageEvent')
  @DocsEditable
  static const EventStreamProvider<MessageEvent> messageEvent = const EventStreamProvider<MessageEvent>('message');

  @DomName('HTMLBodyElement.offlineEvent')
  @DocsEditable
  static const EventStreamProvider<Event> offlineEvent = const EventStreamProvider<Event>('offline');

  @DomName('HTMLBodyElement.onlineEvent')
  @DocsEditable
  static const EventStreamProvider<Event> onlineEvent = const EventStreamProvider<Event>('online');

  @DomName('HTMLBodyElement.popstateEvent')
  @DocsEditable
  static const EventStreamProvider<PopStateEvent> popStateEvent = const EventStreamProvider<PopStateEvent>('popstate');

  @DomName('HTMLBodyElement.resizeEvent')
  @DocsEditable
  static const EventStreamProvider<Event> resizeEvent = const EventStreamProvider<Event>('resize');

  @DomName('HTMLBodyElement.storageEvent')
  @DocsEditable
  static const EventStreamProvider<StorageEvent> storageEvent = const EventStreamProvider<StorageEvent>('storage');

  @DomName('HTMLBodyElement.unloadEvent')
  @DocsEditable
  static const EventStreamProvider<Event> unloadEvent = const EventStreamProvider<Event>('unload');

  @DomName('HTMLBodyElement.HTMLBodyElement')
  @DocsEditable
  factory BodyElement() => document.$dom_createElement("body");

  @DomName('HTMLBodyElement.onbeforeunload')
  @DocsEditable
  Stream<Event> get onBeforeUnload => beforeUnloadEvent.forTarget(this);

  @DomName('HTMLBodyElement.onblur')
  @DocsEditable
  Stream<Event> get onBlur => blurEvent.forTarget(this);

  @DomName('HTMLBodyElement.onerror')
  @DocsEditable
  Stream<Event> get onError => errorEvent.forTarget(this);

  @DomName('HTMLBodyElement.onfocus')
  @DocsEditable
  Stream<Event> get onFocus => focusEvent.forTarget(this);

  @DomName('HTMLBodyElement.onhashchange')
  @DocsEditable
  Stream<Event> get onHashChange => hashChangeEvent.forTarget(this);

  @DomName('HTMLBodyElement.onload')
  @DocsEditable
  Stream<Event> get onLoad => loadEvent.forTarget(this);

  @DomName('HTMLBodyElement.onmessage')
  @DocsEditable
  Stream<MessageEvent> get onMessage => messageEvent.forTarget(this);

  @DomName('HTMLBodyElement.onoffline')
  @DocsEditable
  Stream<Event> get onOffline => offlineEvent.forTarget(this);

  @DomName('HTMLBodyElement.ononline')
  @DocsEditable
  Stream<Event> get onOnline => onlineEvent.forTarget(this);

  @DomName('HTMLBodyElement.onpopstate')
  @DocsEditable
  Stream<PopStateEvent> get onPopState => popStateEvent.forTarget(this);

  @DomName('HTMLBodyElement.onresize')
  @DocsEditable
  Stream<Event> get onResize => resizeEvent.forTarget(this);

  @DomName('HTMLBodyElement.onstorage')
  @DocsEditable
  Stream<StorageEvent> get onStorage => storageEvent.forTarget(this);

  @DomName('HTMLBodyElement.onunload')
  @DocsEditable
  Stream<Event> get onUnload => unloadEvent.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.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('HTMLButtonElement')
class ButtonElement extends _Element_Merged {
  ButtonElement.internal() : super.internal();

  @DomName('HTMLButtonElement.HTMLButtonElement')
  @DocsEditable
  factory ButtonElement() => document.$dom_createElement("button");

  @DomName('HTMLButtonElement.autofocus')
  @DocsEditable
  bool get autofocus native "HTMLButtonElement_autofocus_Getter";

  @DomName('HTMLButtonElement.autofocus')
  @DocsEditable
  void set autofocus(bool value) native "HTMLButtonElement_autofocus_Setter";

  @DomName('HTMLButtonElement.disabled')
  @DocsEditable
  bool get disabled native "HTMLButtonElement_disabled_Getter";

  @DomName('HTMLButtonElement.disabled')
  @DocsEditable
  void set disabled(bool value) native "HTMLButtonElement_disabled_Setter";

  @DomName('HTMLButtonElement.form')
  @DocsEditable
  FormElement get form native "HTMLButtonElement_form_Getter";

  @DomName('HTMLButtonElement.formAction')
  @DocsEditable
  String get formAction native "HTMLButtonElement_formAction_Getter";

  @DomName('HTMLButtonElement.formAction')
  @DocsEditable
  void set formAction(String value) native "HTMLButtonElement_formAction_Setter";

  @DomName('HTMLButtonElement.formEnctype')
  @DocsEditable
  String get formEnctype native "HTMLButtonElement_formEnctype_Getter";

  @DomName('HTMLButtonElement.formEnctype')
  @DocsEditable
  void set formEnctype(String value) native "HTMLButtonElement_formEnctype_Setter";

  @DomName('HTMLButtonElement.formMethod')
  @DocsEditable
  String get formMethod native "HTMLButtonElement_formMethod_Getter";

  @DomName('HTMLButtonElement.formMethod')
  @DocsEditable
  void set formMethod(String value) native "HTMLButtonElement_formMethod_Setter";

  @DomName('HTMLButtonElement.formNoValidate')
  @DocsEditable
  bool get formNoValidate native "HTMLButtonElement_formNoValidate_Getter";

  @DomName('HTMLButtonElement.formNoValidate')
  @DocsEditable
  void set formNoValidate(bool value) native "HTMLButtonElement_formNoValidate_Setter";

  @DomName('HTMLButtonElement.formTarget')
  @DocsEditable
  String get formTarget native "HTMLButtonElement_formTarget_Getter";

  @DomName('HTMLButtonElement.formTarget')
  @DocsEditable
  void set formTarget(String value) native "HTMLButtonElement_formTarget_Setter";

  @DomName('HTMLButtonElement.labels')
  @DocsEditable
  List<Node> get labels native "HTMLButtonElement_labels_Getter";

  @DomName('HTMLButtonElement.name')
  @DocsEditable
  String get name native "HTMLButtonElement_name_Getter";

  @DomName('HTMLButtonElement.name')
  @DocsEditable
  void set name(String value) native "HTMLButtonElement_name_Setter";

  @DomName('HTMLButtonElement.type')
  @DocsEditable
  String get type native "HTMLButtonElement_type_Getter";

  @DomName('HTMLButtonElement.type')
  @DocsEditable
  void set type(String value) native "HTMLButtonElement_type_Setter";

  @DomName('HTMLButtonElement.validationMessage')
  @DocsEditable
  String get validationMessage native "HTMLButtonElement_validationMessage_Getter";

  @DomName('HTMLButtonElement.validity')
  @DocsEditable
  ValidityState get validity native "HTMLButtonElement_validity_Getter";

  @DomName('HTMLButtonElement.value')
  @DocsEditable
  String get value native "HTMLButtonElement_value_Getter";

  @DomName('HTMLButtonElement.value')
  @DocsEditable
  void set value(String value) native "HTMLButtonElement_value_Setter";

  @DomName('HTMLButtonElement.willValidate')
  @DocsEditable
  bool get willValidate native "HTMLButtonElement_willValidate_Getter";

  @DomName('HTMLButtonElement.checkValidity')
  @DocsEditable
  bool checkValidity() native "HTMLButtonElement_checkValidity_Callback";

  @DomName('HTMLButtonElement.setCustomValidity')
  @DocsEditable
  void setCustomValidity(String error) native "HTMLButtonElement_setCustomValidity_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('CDATASection')
class CDataSection extends Text {
  CDataSection.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('HTMLCanvasElement')
class CanvasElement extends _Element_Merged implements CanvasImageSource {
  CanvasElement.internal() : super.internal();

  @DomName('HTMLCanvasElement.HTMLCanvasElement')
  @DocsEditable
  factory CanvasElement({int width, int height}) {
    var e = document.$dom_createElement("canvas");
    if (width != null) e.width = width;
    if (height != null) e.height = height;
    return e;
  }

  /// The height of this canvas element in CSS pixels.
  @DomName('HTMLCanvasElement.height')
  @DocsEditable
  int get height native "HTMLCanvasElement_height_Getter";

  /// The height of this canvas element in CSS pixels.
  @DomName('HTMLCanvasElement.height')
  @DocsEditable
  void set height(int value) native "HTMLCanvasElement_height_Setter";

  /// The width of this canvas element in CSS pixels.
  @DomName('HTMLCanvasElement.width')
  @DocsEditable
  int get width native "HTMLCanvasElement_width_Getter";

  /// The width of this canvas element in CSS pixels.
  @DomName('HTMLCanvasElement.width')
  @DocsEditable
  void set width(int value) native "HTMLCanvasElement_width_Setter";

  @DomName('HTMLCanvasElement.getContext')
  @DocsEditable
  CanvasRenderingContext getContext(String contextId, [Map attrs]) native "HTMLCanvasElement_getContext_Callback";

  /**
   * Returns a data URI containing a representation of the image in the
   * format specified by type (defaults to 'image/png').
   *
   * Data Uri format is as follow `data:[<MIME-type>][;charset=<encoding>][;base64],<data>`
   *
   * Optional parameter [quality] in the range of 0.0 and 1.0 can be used when requesting [type]
   * 'image/jpeg' or 'image/webp'. If [quality] is not passed the default
   * value is used. Note: the default value varies by browser.
   *
   * If the height or width of this canvas element is 0, then 'data:' is returned,
   * representing no data.
   *
   * If the type requested is not 'image/png', and the returned value is
   * 'data:image/png', then the requested type is not supported.
   *
   * Example usage:
   *
   *     CanvasElement canvas = new CanvasElement();
   *     var ctx = canvas.context2d
   *     ..fillStyle = "rgb(200,0,0)"
   *     ..fillRect(10, 10, 55, 50);
   *     var dataUrl = canvas.toDataURL("image/jpeg", 0.95);
   *     // The Data Uri would look similar to
   *     // 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUA
   *     // AAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO
   *     // 9TXL0Y4OHwAAAABJRU5ErkJggg=='
   *     //Create a new image element from the data URI.
   *     var img = new ImageElement();
   *     img.src = dataUrl;
   *     document.body.children.add(img);
   *
   * See also:
   *
   * * [Data URI Scheme](http://en.wikipedia.org/wiki/Data_URI_scheme) from Wikipedia.
   *
   * * [HTMLCanvasElement](https://developer.mozilla.org/en-US/docs/DOM/HTMLCanvasElement) from MDN.
   *
   * * [toDataUrl](http://dev.w3.org/html5/spec/the-canvas-element.html#dom-canvas-todataurl) from W3C.
   */
  @DomName('HTMLCanvasElement.toDataURL')
  @DocsEditable
  String toDataUrl(String type, [num quality]) native "HTMLCanvasElement_toDataURL_Callback";

  CanvasRenderingContext2D get context2d => getContext('2d');

  @SupportedBrowser(SupportedBrowser.CHROME)
  @SupportedBrowser(SupportedBrowser.FIREFOX)
  @Experimental
  WebGLRenderingContext getContext3d({alpha: true, depth: true, stencil: false,
    antialias: true, premultipliedAlpha: true, preserveDrawingBuffer: false}) {

    var options = {
      'alpha': alpha,
      'depth': depth,
      'stencil': stencil,
      'antialias': antialias,
      'premultipliedAlpha': premultipliedAlpha,
      'preserveDrawingBuffer': preserveDrawingBuffer,
    };
    var context = getContext('webgl', options);
    if (context == null) {
      context = getContext('experimental-webgl', options);
    }
    return context;
  }
}
// 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.


@DocsEditable
/**
 * An opaque canvas object representing a gradient.
 *
 * Created by calling [createLinearGradient] or [createRadialGradient] on a
 * [CanvasRenderingContext2D] object.
 *
 * Example usage:
 *
 *     var canvas = new CanvasElement(width: 600, height: 600);
 *     var ctx = canvas.context2d;
 *     ctx.clearRect(0, 0, 600, 600);
 *     ctx.save();
 *     // Create radial gradient.
 *     CanvasGradient gradient = ctx.createRadialGradient(0, 0, 0, 0, 0, 600);
 *     gradient.addColorStop(0, '#000');
 *     gradient.addColorStop(1, 'rgb(255, 255, 255)');
 *     // Assign gradients to fill.
 *     ctx.fillStyle = gradient;
 *     // Draw a rectangle with a gradient fill.
 *     ctx.fillRect(0, 0, 600, 600);
 *     ctx.save();
 *     document.body.children.add(canvas);
 *
 * See also:
 *
 * * [CanvasGradient](https://developer.mozilla.org/en-US/docs/DOM/CanvasGradient) from MDN.
 * * [CanvasGradient](http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#canvasgradient) from whatwg.
 * * [CanvasGradient](http://www.w3.org/TR/2010/WD-2dcontext-20100304/#canvasgradient) from W3C.
 */
@DomName('CanvasGradient')
class CanvasGradient extends NativeFieldWrapperClass1 {
  CanvasGradient.internal();

  /**
   * Adds a color stop to this gradient at the offset.
   *
   * The [offset] can range between 0.0 and 1.0.
   *
   * See also:
   *
   * * [Multiple Color Stops](https://developer.mozilla.org/en-US/docs/CSS/linear-gradient#Gradient_with_multiple_color_stops) from MDN.
   */
  @DomName('CanvasGradient.addColorStop')
  @DocsEditable
  void addColorStop(num offset, String color) native "CanvasGradient_addColorStop_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
/**
 * An opaque object representing a pattern of image, canvas, or video.
 *
 * Created by calling [createPattern] on a [CanvasRenderingContext2D] object.
 *
 * Example usage:
 *
 *     var canvas = new CanvasElement(width: 600, height: 600);
 *     var ctx = canvas.context2d;
 *     var img = new ImageElement();
 *     // Image src needs to be loaded before pattern is applied.
 *     img.onLoad.listen((event) {
 *       // When the image is loaded, create a pattern
 *       // from the ImageElement.
 *       CanvasPattern pattern = ctx.createPattern(img, 'repeat');
 *       ctx.rect(0, 0, canvas.width, canvas.height);
 *       ctx.fillStyle = pattern;
 *       ctx.fill();
 *     });
 *     img.src = "images/foo.jpg";
 *     document.body.children.add(canvas);
 *
 * See also:
 * * [CanvasPattern](https://developer.mozilla.org/en-US/docs/DOM/CanvasPattern) from MDN.
 * * [CanvasPattern](http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#canvaspattern) from whatwg.
 * * [CanvasPattern](http://www.w3.org/TR/2010/WD-2dcontext-20100304/#canvaspattern) from W3C.
 */
@DomName('CanvasPattern')
class CanvasPattern extends NativeFieldWrapperClass1 {
  CanvasPattern.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.

// WARNING: Do not edit - generated code.


@DocsEditable
/**
 * A rendering context for a canvas element.
 *
 * This context is extended by [CanvasRenderingContext2D] and
 * [WebGLRenderingContext].
 */
@DomName('CanvasRenderingContext')
class CanvasRenderingContext extends NativeFieldWrapperClass1 {
  CanvasRenderingContext.internal();

  /// Reference to the canvas element to which this context belongs.
  @DomName('CanvasRenderingContext.canvas')
  @DocsEditable
  CanvasElement get canvas native "CanvasRenderingContext_canvas_Getter";

}
// 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('CanvasRenderingContext2D')
class CanvasRenderingContext2D extends CanvasRenderingContext {
  CanvasRenderingContext2D.internal() : super.internal();

  @DomName('CanvasRenderingContext2D.fillStyle')
  @DocsEditable
  dynamic get fillStyle native "CanvasRenderingContext2D_fillStyle_Getter";

  @DomName('CanvasRenderingContext2D.fillStyle')
  @DocsEditable
  void set fillStyle(dynamic value) native "CanvasRenderingContext2D_fillStyle_Setter";

  @DomName('CanvasRenderingContext2D.font')
  @DocsEditable
  String get font native "CanvasRenderingContext2D_font_Getter";

  @DomName('CanvasRenderingContext2D.font')
  @DocsEditable
  void set font(String value) native "CanvasRenderingContext2D_font_Setter";

  @DomName('CanvasRenderingContext2D.globalAlpha')
  @DocsEditable
  num get globalAlpha native "CanvasRenderingContext2D_globalAlpha_Getter";

  @DomName('CanvasRenderingContext2D.globalAlpha')
  @DocsEditable
  void set globalAlpha(num value) native "CanvasRenderingContext2D_globalAlpha_Setter";

  @DomName('CanvasRenderingContext2D.globalCompositeOperation')
  @DocsEditable
  String get globalCompositeOperation native "CanvasRenderingContext2D_globalCompositeOperation_Getter";

  @DomName('CanvasRenderingContext2D.globalCompositeOperation')
  @DocsEditable
  void set globalCompositeOperation(String value) native "CanvasRenderingContext2D_globalCompositeOperation_Setter";

  @DomName('CanvasRenderingContext2D.lineCap')
  @DocsEditable
  String get lineCap native "CanvasRenderingContext2D_lineCap_Getter";

  @DomName('CanvasRenderingContext2D.lineCap')
  @DocsEditable
  void set lineCap(String value) native "CanvasRenderingContext2D_lineCap_Setter";

  @DomName('CanvasRenderingContext2D.lineDashOffset')
  @DocsEditable
  num get lineDashOffset native "CanvasRenderingContext2D_lineDashOffset_Getter";

  @DomName('CanvasRenderingContext2D.lineDashOffset')
  @DocsEditable
  void set lineDashOffset(num value) native "CanvasRenderingContext2D_lineDashOffset_Setter";

  @DomName('CanvasRenderingContext2D.lineJoin')
  @DocsEditable
  String get lineJoin native "CanvasRenderingContext2D_lineJoin_Getter";

  @DomName('CanvasRenderingContext2D.lineJoin')
  @DocsEditable
  void set lineJoin(String value) native "CanvasRenderingContext2D_lineJoin_Setter";

  @DomName('CanvasRenderingContext2D.lineWidth')
  @DocsEditable
  num get lineWidth native "CanvasRenderingContext2D_lineWidth_Getter";

  @DomName('CanvasRenderingContext2D.lineWidth')
  @DocsEditable
  void set lineWidth(num value) native "CanvasRenderingContext2D_lineWidth_Setter";

  @DomName('CanvasRenderingContext2D.miterLimit')
  @DocsEditable
  num get miterLimit native "CanvasRenderingContext2D_miterLimit_Getter";

  @DomName('CanvasRenderingContext2D.miterLimit')
  @DocsEditable
  void set miterLimit(num value) native "CanvasRenderingContext2D_miterLimit_Setter";

  @DomName('CanvasRenderingContext2D.shadowBlur')
  @DocsEditable
  num get shadowBlur native "CanvasRenderingContext2D_shadowBlur_Getter";

  @DomName('CanvasRenderingContext2D.shadowBlur')
  @DocsEditable
  void set shadowBlur(num value) native "CanvasRenderingContext2D_shadowBlur_Setter";

  @DomName('CanvasRenderingContext2D.shadowColor')
  @DocsEditable
  String get shadowColor native "CanvasRenderingContext2D_shadowColor_Getter";

  @DomName('CanvasRenderingContext2D.shadowColor')
  @DocsEditable
  void set shadowColor(String value) native "CanvasRenderingContext2D_shadowColor_Setter";

  @DomName('CanvasRenderingContext2D.shadowOffsetX')
  @DocsEditable
  num get shadowOffsetX native "CanvasRenderingContext2D_shadowOffsetX_Getter";

  @DomName('CanvasRenderingContext2D.shadowOffsetX')
  @DocsEditable
  void set shadowOffsetX(num value) native "CanvasRenderingContext2D_shadowOffsetX_Setter";

  @DomName('CanvasRenderingContext2D.shadowOffsetY')
  @DocsEditable
  num get shadowOffsetY native "CanvasRenderingContext2D_shadowOffsetY_Getter";

  @DomName('CanvasRenderingContext2D.shadowOffsetY')
  @DocsEditable
  void set shadowOffsetY(num value) native "CanvasRenderingContext2D_shadowOffsetY_Setter";

  @DomName('CanvasRenderingContext2D.strokeStyle')
  @DocsEditable
  dynamic get strokeStyle native "CanvasRenderingContext2D_strokeStyle_Getter";

  @DomName('CanvasRenderingContext2D.strokeStyle')
  @DocsEditable
  void set strokeStyle(dynamic value) native "CanvasRenderingContext2D_strokeStyle_Setter";

  @DomName('CanvasRenderingContext2D.textAlign')
  @DocsEditable
  String get textAlign native "CanvasRenderingContext2D_textAlign_Getter";

  @DomName('CanvasRenderingContext2D.textAlign')
  @DocsEditable
  void set textAlign(String value) native "CanvasRenderingContext2D_textAlign_Setter";

  @DomName('CanvasRenderingContext2D.textBaseline')
  @DocsEditable
  String get textBaseline native "CanvasRenderingContext2D_textBaseline_Getter";

  @DomName('CanvasRenderingContext2D.textBaseline')
  @DocsEditable
  void set textBaseline(String value) native "CanvasRenderingContext2D_textBaseline_Setter";

  @DomName('CanvasRenderingContext2D.webkitBackingStorePixelRatio')
  @DocsEditable
  @SupportedBrowser(SupportedBrowser.CHROME)
  @SupportedBrowser(SupportedBrowser.SAFARI)
  @Experimental
  num get backingStorePixelRatio native "CanvasRenderingContext2D_webkitBackingStorePixelRatio_Getter";

  @DomName('CanvasRenderingContext2D.webkitImageSmoothingEnabled')
  @DocsEditable
  @SupportedBrowser(SupportedBrowser.CHROME)
  @SupportedBrowser(SupportedBrowser.SAFARI)
  @Experimental
  bool get imageSmoothingEnabled native "CanvasRenderingContext2D_webkitImageSmoothingEnabled_Getter";

  @DomName('CanvasRenderingContext2D.webkitImageSmoothingEnabled')
  @DocsEditable
  @SupportedBrowser(SupportedBrowser.CHROME)
  @SupportedBrowser(SupportedBrowser.SAFARI)
  @Experimental
  void set imageSmoothingEnabled(bool value) native "CanvasRenderingContext2D_webkitImageSmoothingEnabled_Setter";

  @DomName('CanvasRenderingContext2D.webkitLineDash')
  @DocsEditable
  @SupportedBrowser(SupportedBrowser.CHROME)
  @SupportedBrowser(SupportedBrowser.SAFARI)
  @Experimental
  List get lineDash native "CanvasRenderingContext2D_webkitLineDash_Getter";

  @DomName('CanvasRenderingContext2D.webkitLineDash')
  @DocsEditable
  @SupportedBrowser(SupportedBrowser.CHROME)
  @SupportedBrowser(SupportedBrowser.SAFARI)
  @Experimental
  void set lineDash(List value) native "CanvasRenderingContext2D_webkitLineDash_Setter";

  @DomName('CanvasRenderingContext2D.arc')
  @DocsEditable
  void $dom_arc(num x, num y, num radius, num startAngle, num endAngle, bool anticlockwise) native "CanvasRenderingContext2D_arc_Callback";

  @DomName('CanvasRenderingContext2D.arcTo')
  @DocsEditable
  void arcTo(num x1, num y1, num x2, num y2, num radius) native "CanvasRenderingContext2D_arcTo_Callback";

  @DomName('CanvasRenderingContext2D.beginPath')
  @DocsEditable
  void beginPath() native "CanvasRenderingContext2D_beginPath_Callback";

  @DomName('CanvasRenderingContext2D.bezierCurveTo')
  @DocsEditable
  void bezierCurveTo(num cp1x, num cp1y, num cp2x, num cp2y, num x, num y) native "CanvasRenderingContext2D_bezierCurveTo_Callback";

  @DomName('CanvasRenderingContext2D.clearRect')
  @DocsEditable
  void clearRect(num x, num y, num width, num height) native "CanvasRenderingContext2D_clearRect_Callback";

  void clip([String winding]) {
    if (?winding) {
      _clip_1(winding);
      return;
    }
    _clip_2();
    return;
  }

  @DomName('CanvasRenderingContext2D._clip_1')
  @DocsEditable
  void _clip_1(winding) native "CanvasRenderingContext2D__clip_1_Callback";

  @DomName('CanvasRenderingContext2D._clip_2')
  @DocsEditable
  void _clip_2() native "CanvasRenderingContext2D__clip_2_Callback";

  @DomName('CanvasRenderingContext2D.closePath')
  @DocsEditable
  void closePath() native "CanvasRenderingContext2D_closePath_Callback";

  ImageData createImageData(imagedata_OR_sw, [num sh]) {
    if ((imagedata_OR_sw is ImageData || imagedata_OR_sw == null) && !?sh) {
      return _createImageData_1(imagedata_OR_sw);
    }
    if ((imagedata_OR_sw is num || imagedata_OR_sw == null) && (sh is num || sh == null)) {
      return _createImageData_2(imagedata_OR_sw, sh);
    }
    throw new ArgumentError("Incorrect number or type of arguments");
  }

  @DomName('CanvasRenderingContext2D._createImageData_1')
  @DocsEditable
  ImageData _createImageData_1(imagedata_OR_sw) native "CanvasRenderingContext2D__createImageData_1_Callback";

  @DomName('CanvasRenderingContext2D._createImageData_2')
  @DocsEditable
  ImageData _createImageData_2(imagedata_OR_sw, sh) native "CanvasRenderingContext2D__createImageData_2_Callback";

  @DomName('CanvasRenderingContext2D.createLinearGradient')
  @DocsEditable
  CanvasGradient createLinearGradient(num x0, num y0, num x1, num y1) native "CanvasRenderingContext2D_createLinearGradient_Callback";

  CanvasPattern createPattern(canvas_OR_image, String repetitionType) {
    if ((canvas_OR_image is CanvasElement || canvas_OR_image == null) && (repetitionType is String || repetitionType == null)) {
      return _createPattern_1(canvas_OR_image, repetitionType);
    }
    if ((canvas_OR_image is ImageElement || canvas_OR_image == null) && (repetitionType is String || repetitionType == null)) {
      return _createPattern_2(canvas_OR_image, repetitionType);
    }
    throw new ArgumentError("Incorrect number or type of arguments");
  }

  @DomName('CanvasRenderingContext2D._createPattern_1')
  @DocsEditable
  CanvasPattern _createPattern_1(canvas_OR_image, repetitionType) native "CanvasRenderingContext2D__createPattern_1_Callback";

  @DomName('CanvasRenderingContext2D._createPattern_2')
  @DocsEditable
  CanvasPattern _createPattern_2(canvas_OR_image, repetitionType) native "CanvasRenderingContext2D__createPattern_2_Callback";

  @DomName('CanvasRenderingContext2D.createRadialGradient')
  @DocsEditable
  CanvasGradient createRadialGradient(num x0, num y0, num r0, num x1, num y1, num r1) native "CanvasRenderingContext2D_createRadialGradient_Callback";

  void $dom_drawImage(canvas_OR_image_OR_video, num sx_OR_x, num sy_OR_y, [num sw_OR_width, num height_OR_sh, num dx, num dy, num dw, num dh]) {
    if ((canvas_OR_image_OR_video is ImageElement || canvas_OR_image_OR_video == null) && (sx_OR_x is num || sx_OR_x == null) && (sy_OR_y is num || sy_OR_y == null) && !?sw_OR_width && !?height_OR_sh && !?dx && !?dy && !?dw && !?dh) {
      _drawImage_1(canvas_OR_image_OR_video, sx_OR_x, sy_OR_y);
      return;
    }
    if ((canvas_OR_image_OR_video is ImageElement || canvas_OR_image_OR_video == null) && (sx_OR_x is num || sx_OR_x == null) && (sy_OR_y is num || sy_OR_y == null) && (sw_OR_width is num || sw_OR_width == null) && (height_OR_sh is num || height_OR_sh == null) && !?dx && !?dy && !?dw && !?dh) {
      _drawImage_2(canvas_OR_image_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh);
      return;
    }
    if ((canvas_OR_image_OR_video is ImageElement || canvas_OR_image_OR_video == null) && (sx_OR_x is num || sx_OR_x == null) && (sy_OR_y is num || sy_OR_y == null) && (sw_OR_width is num || sw_OR_width == null) && (height_OR_sh is num || height_OR_sh == null) && (dx is num || dx == null) && (dy is num || dy == null) && (dw is num || dw == null) && (dh is num || dh == null)) {
      _drawImage_3(canvas_OR_image_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh);
      return;
    }
    if ((canvas_OR_image_OR_video is CanvasElement || canvas_OR_image_OR_video == null) && (sx_OR_x is num || sx_OR_x == null) && (sy_OR_y is num || sy_OR_y == null) && !?sw_OR_width && !?height_OR_sh && !?dx && !?dy && !?dw && !?dh) {
      _drawImage_4(canvas_OR_image_OR_video, sx_OR_x, sy_OR_y);
      return;
    }
    if ((canvas_OR_image_OR_video is CanvasElement || canvas_OR_image_OR_video == null) && (sx_OR_x is num || sx_OR_x == null) && (sy_OR_y is num || sy_OR_y == null) && (sw_OR_width is num || sw_OR_width == null) && (height_OR_sh is num || height_OR_sh == null) && !?dx && !?dy && !?dw && !?dh) {
      _drawImage_5(canvas_OR_image_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh);
      return;
    }
    if ((canvas_OR_image_OR_video is CanvasElement || canvas_OR_image_OR_video == null) && (sx_OR_x is num || sx_OR_x == null) && (sy_OR_y is num || sy_OR_y == null) && (sw_OR_width is num || sw_OR_width == null) && (height_OR_sh is num || height_OR_sh == null) && (dx is num || dx == null) && (dy is num || dy == null) && (dw is num || dw == null) && (dh is num || dh == null)) {
      _drawImage_6(canvas_OR_image_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh);
      return;
    }
    if ((canvas_OR_image_OR_video is VideoElement || canvas_OR_image_OR_video == null) && (sx_OR_x is num || sx_OR_x == null) && (sy_OR_y is num || sy_OR_y == null) && !?sw_OR_width && !?height_OR_sh && !?dx && !?dy && !?dw && !?dh) {
      _drawImage_7(canvas_OR_image_OR_video, sx_OR_x, sy_OR_y);
      return;
    }
    if ((canvas_OR_image_OR_video is VideoElement || canvas_OR_image_OR_video == null) && (sx_OR_x is num || sx_OR_x == null) && (sy_OR_y is num || sy_OR_y == null) && (sw_OR_width is num || sw_OR_width == null) && (height_OR_sh is num || height_OR_sh == null) && !?dx && !?dy && !?dw && !?dh) {
      _drawImage_8(canvas_OR_image_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh);
      return;
    }
    if ((canvas_OR_image_OR_video is VideoElement || canvas_OR_image_OR_video == null) && (sx_OR_x is num || sx_OR_x == null) && (sy_OR_y is num || sy_OR_y == null) && (sw_OR_width is num || sw_OR_width == null) && (height_OR_sh is num || height_OR_sh == null) && (dx is num || dx == null) && (dy is num || dy == null) && (dw is num || dw == null) && (dh is num || dh == null)) {
      _drawImage_9(canvas_OR_image_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh);
      return;
    }
    throw new ArgumentError("Incorrect number or type of arguments");
  }

  @DomName('CanvasRenderingContext2D._drawImage_1')
  @DocsEditable
  void _drawImage_1(canvas_OR_image_OR_video, sx_OR_x, sy_OR_y) native "CanvasRenderingContext2D__drawImage_1_Callback";

  @DomName('CanvasRenderingContext2D._drawImage_2')
  @DocsEditable
  void _drawImage_2(canvas_OR_image_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh) native "CanvasRenderingContext2D__drawImage_2_Callback";

  @DomName('CanvasRenderingContext2D._drawImage_3')
  @DocsEditable
  void _drawImage_3(canvas_OR_image_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh) native "CanvasRenderingContext2D__drawImage_3_Callback";

  @DomName('CanvasRenderingContext2D._drawImage_4')
  @DocsEditable
  void _drawImage_4(canvas_OR_image_OR_video, sx_OR_x, sy_OR_y) native "CanvasRenderingContext2D__drawImage_4_Callback";

  @DomName('CanvasRenderingContext2D._drawImage_5')
  @DocsEditable
  void _drawImage_5(canvas_OR_image_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh) native "CanvasRenderingContext2D__drawImage_5_Callback";

  @DomName('CanvasRenderingContext2D._drawImage_6')
  @DocsEditable
  void _drawImage_6(canvas_OR_image_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh) native "CanvasRenderingContext2D__drawImage_6_Callback";

  @DomName('CanvasRenderingContext2D._drawImage_7')
  @DocsEditable
  void _drawImage_7(canvas_OR_image_OR_video, sx_OR_x, sy_OR_y) native "CanvasRenderingContext2D__drawImage_7_Callback";

  @DomName('CanvasRenderingContext2D._drawImage_8')
  @DocsEditable
  void _drawImage_8(canvas_OR_image_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh) native "CanvasRenderingContext2D__drawImage_8_Callback";

  @DomName('CanvasRenderingContext2D._drawImage_9')
  @DocsEditable
  void _drawImage_9(canvas_OR_image_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh) native "CanvasRenderingContext2D__drawImage_9_Callback";

  void fill([String winding]) {
    if (?winding) {
      _fill_1(winding);
      return;
    }
    _fill_2();
    return;
  }

  @DomName('CanvasRenderingContext2D._fill_1')
  @DocsEditable
  void _fill_1(winding) native "CanvasRenderingContext2D__fill_1_Callback";

  @DomName('CanvasRenderingContext2D._fill_2')
  @DocsEditable
  void _fill_2() native "CanvasRenderingContext2D__fill_2_Callback";

  @DomName('CanvasRenderingContext2D.fillRect')
  @DocsEditable
  void fillRect(num x, num y, num width, num height) native "CanvasRenderingContext2D_fillRect_Callback";

  void fillText(String text, num x, num y, [num maxWidth]) {
    if (?maxWidth) {
      _fillText_1(text, x, y, maxWidth);
      return;
    }
    _fillText_2(text, x, y);
    return;
  }

  @DomName('CanvasRenderingContext2D._fillText_1')
  @DocsEditable
  void _fillText_1(text, x, y, maxWidth) native "CanvasRenderingContext2D__fillText_1_Callback";

  @DomName('CanvasRenderingContext2D._fillText_2')
  @DocsEditable
  void _fillText_2(text, x, y) native "CanvasRenderingContext2D__fillText_2_Callback";

  @DomName('CanvasRenderingContext2D.getImageData')
  @DocsEditable
  ImageData getImageData(num sx, num sy, num sw, num sh) native "CanvasRenderingContext2D_getImageData_Callback";

  @DomName('CanvasRenderingContext2D.getLineDash')
  @DocsEditable
  List<num> getLineDash() native "CanvasRenderingContext2D_getLineDash_Callback";

  bool isPointInPath(num x, num y, [String winding]) {
    if (?winding) {
      return _isPointInPath_1(x, y, winding);
    }
    return _isPointInPath_2(x, y);
  }

  @DomName('CanvasRenderingContext2D._isPointInPath_1')
  @DocsEditable
  bool _isPointInPath_1(x, y, winding) native "CanvasRenderingContext2D__isPointInPath_1_Callback";

  @DomName('CanvasRenderingContext2D._isPointInPath_2')
  @DocsEditable
  bool _isPointInPath_2(x, y) native "CanvasRenderingContext2D__isPointInPath_2_Callback";

  @DomName('CanvasRenderingContext2D.isPointInStroke')
  @DocsEditable
  bool isPointInStroke(num x, num y) native "CanvasRenderingContext2D_isPointInStroke_Callback";

  @DomName('CanvasRenderingContext2D.lineTo')
  @DocsEditable
  void lineTo(num x, num y) native "CanvasRenderingContext2D_lineTo_Callback";

  @DomName('CanvasRenderingContext2D.measureText')
  @DocsEditable
  TextMetrics measureText(String text) native "CanvasRenderingContext2D_measureText_Callback";

  @DomName('CanvasRenderingContext2D.moveTo')
  @DocsEditable
  void moveTo(num x, num y) native "CanvasRenderingContext2D_moveTo_Callback";

  void putImageData(ImageData imagedata, num dx, num dy, [num dirtyX, num dirtyY, num dirtyWidth, num dirtyHeight]) {
    if ((imagedata is ImageData || imagedata == null) && (dx is num || dx == null) && (dy is num || dy == null) && !?dirtyX && !?dirtyY && !?dirtyWidth && !?dirtyHeight) {
      _putImageData_1(imagedata, dx, dy);
      return;
    }
    if ((imagedata is ImageData || imagedata == null) && (dx is num || dx == null) && (dy is num || dy == null) && (dirtyX is num || dirtyX == null) && (dirtyY is num || dirtyY == null) && (dirtyWidth is num || dirtyWidth == null) && (dirtyHeight is num || dirtyHeight == null)) {
      _putImageData_2(imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight);
      return;
    }
    throw new ArgumentError("Incorrect number or type of arguments");
  }

  @DomName('CanvasRenderingContext2D._putImageData_1')
  @DocsEditable
  void _putImageData_1(imagedata, dx, dy) native "CanvasRenderingContext2D__putImageData_1_Callback";

  @DomName('CanvasRenderingContext2D._putImageData_2')
  @DocsEditable
  void _putImageData_2(imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight) native "CanvasRenderingContext2D__putImageData_2_Callback";

  @DomName('CanvasRenderingContext2D.quadraticCurveTo')
  @DocsEditable
  void quadraticCurveTo(num cpx, num cpy, num x, num y) native "CanvasRenderingContext2D_quadraticCurveTo_Callback";

  @DomName('CanvasRenderingContext2D.rect')
  @DocsEditable
  void rect(num x, num y, num width, num height) native "CanvasRenderingContext2D_rect_Callback";

  @DomName('CanvasRenderingContext2D.restore')
  @DocsEditable
  void restore() native "CanvasRenderingContext2D_restore_Callback";

  @DomName('CanvasRenderingContext2D.rotate')
  @DocsEditable
  void rotate(num angle) native "CanvasRenderingContext2D_rotate_Callback";

  @DomName('CanvasRenderingContext2D.save')
  @DocsEditable
  void save() native "CanvasRenderingContext2D_save_Callback";

  @DomName('CanvasRenderingContext2D.scale')
  @DocsEditable
  void scale(num sx, num sy) native "CanvasRenderingContext2D_scale_Callback";

  @DomName('CanvasRenderingContext2D.setLineDash')
  @DocsEditable
  void setLineDash(List<num> dash) native "CanvasRenderingContext2D_setLineDash_Callback";

  @DomName('CanvasRenderingContext2D.setTransform')
  @DocsEditable
  void setTransform(num m11, num m12, num m21, num m22, num dx, num dy) native "CanvasRenderingContext2D_setTransform_Callback";

  @DomName('CanvasRenderingContext2D.stroke')
  @DocsEditable
  void stroke() native "CanvasRenderingContext2D_stroke_Callback";

  void strokeRect(num x, num y, num width, num height, [num lineWidth]) {
    if (?lineWidth) {
      _strokeRect_1(x, y, width, height, lineWidth);
      return;
    }
    _strokeRect_2(x, y, width, height);
    return;
  }

  @DomName('CanvasRenderingContext2D._strokeRect_1')
  @DocsEditable
  void _strokeRect_1(x, y, width, height, lineWidth) native "CanvasRenderingContext2D__strokeRect_1_Callback";

  @DomName('CanvasRenderingContext2D._strokeRect_2')
  @DocsEditable
  void _strokeRect_2(x, y, width, height) native "CanvasRenderingContext2D__strokeRect_2_Callback";

  void strokeText(String text, num x, num y, [num maxWidth]) {
    if (?maxWidth) {
      _strokeText_1(text, x, y, maxWidth);
      return;
    }
    _strokeText_2(text, x, y);
    return;
  }

  @DomName('CanvasRenderingContext2D._strokeText_1')
  @DocsEditable
  void _strokeText_1(text, x, y, maxWidth) native "CanvasRenderingContext2D__strokeText_1_Callback";

  @DomName('CanvasRenderingContext2D._strokeText_2')
  @DocsEditable
  void _strokeText_2(text, x, y) native "CanvasRenderingContext2D__strokeText_2_Callback";

  @DomName('CanvasRenderingContext2D.transform')
  @DocsEditable
  void transform(num m11, num m12, num m21, num m22, num dx, num dy) native "CanvasRenderingContext2D_transform_Callback";

  @DomName('CanvasRenderingContext2D.translate')
  @DocsEditable
  void translate(num tx, num ty) native "CanvasRenderingContext2D_translate_Callback";

  @DomName('CanvasRenderingContext2D.webkitGetImageDataHD')
  @DocsEditable
  @SupportedBrowser(SupportedBrowser.CHROME)
  @SupportedBrowser(SupportedBrowser.SAFARI)
  @Experimental
  ImageData getImageDataHD(num sx, num sy, num sw, num sh) native "CanvasRenderingContext2D_webkitGetImageDataHD_Callback";

  void putImageDataHD(ImageData imagedata, num dx, num dy, [num dirtyX, num dirtyY, num dirtyWidth, num dirtyHeight]) {
    if ((imagedata is ImageData || imagedata == null) && (dx is num || dx == null) && (dy is num || dy == null) && !?dirtyX && !?dirtyY && !?dirtyWidth && !?dirtyHeight) {
      _webkitPutImageDataHD_1(imagedata, dx, dy);
      return;
    }
    if ((imagedata is ImageData || imagedata == null) && (dx is num || dx == null) && (dy is num || dy == null) && (dirtyX is num || dirtyX == null) && (dirtyY is num || dirtyY == null) && (dirtyWidth is num || dirtyWidth == null) && (dirtyHeight is num || dirtyHeight == null)) {
      _webkitPutImageDataHD_2(imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight);
      return;
    }
    throw new ArgumentError("Incorrect number or type of arguments");
  }

  @DomName('CanvasRenderingContext2D._webkitPutImageDataHD_1')
  @DocsEditable
  void _webkitPutImageDataHD_1(imagedata, dx, dy) native "CanvasRenderingContext2D__webkitPutImageDataHD_1_Callback";

  @DomName('CanvasRenderingContext2D._webkitPutImageDataHD_2')
  @DocsEditable
  void _webkitPutImageDataHD_2(imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight) native "CanvasRenderingContext2D__webkitPutImageDataHD_2_Callback";


  /**
   * Sets the color used inside shapes.
   * [r], [g], [b] are 0-255, [a] is 0-1.
   */
  void setFillColorRgb(int r, int g, int b, [num a = 1]) {
    this.fillStyle = 'rgba($r, $g, $b, $a)';
  }

  /**
   * Sets the color used inside shapes.
   * [h] is in degrees, 0-360.
   * [s], [l] are in percent, 0-100.
   * [a] is 0-1.
   */
  void setFillColorHsl(int h, num s, num l, [num a = 1]) {
    this.fillStyle = 'hsla($h, $s%, $l%, $a)';
  }

  /**
   * Sets the color used for stroking shapes.
   * [r], [g], [b] are 0-255, [a] is 0-1.
   */
  void setStrokeColorRgb(int r, int g, int b, [num a = 1]) {
    this.strokeStyle = 'rgba($r, $g, $b, $a)';
  }

  /**
   * Sets the color used for stroking shapes.
   * [h] is in degrees, 0-360.
   * [s], [l] are in percent, 0-100.
   * [a] is 0-1.
   */
  void setStrokeColorHsl(int h, num s, num l, [num a = 1]) {
    this.strokeStyle = 'hsla($h, $s%, $l%, $a)';
  }

  @DomName('CanvasRenderingContext2D.arc')
  void arc(num x,  num y,  num radius,  num startAngle, num endAngle,
      [bool anticlockwise = false]) {
    $dom_arc(x, y, radius, startAngle, endAngle, anticlockwise);
  }

  /**
   * Draws an image from a CanvasImageSource to this canvas.
   *
   * The entire image from [source] will be drawn to this context with its top
   * left corner at the point ([destinationX], [destinationY]). If the image is
   * larger than canvas will allow, the image will be cropped to fit the
   * available space.
   *
   *     CanvasElement canvas = new CanvasElement(width: 600, height: 600);
   *     CanvasRenderingContext2D ctx = canvas.context2d;
   *     ImageElement img = document.query('img');
   *
   *     ctx.drawImage(img, 100, 100);
   *
   *     VideoElement video = document.query('video');
   *     ctx.drawImage(video, 0, 0);
   *
   *     CanvasElement otherCanvas = document.query('canvas');
   *     otherCanvas.width = 100;
   *     otherCanvas.height = 100;
   *     ctx.drawImage(otherCanvas, 590, 590); // will get cropped
   *
   * See also:
   *
   *   * [CanvasImageSource] for more information on what data is retrieved
   * from [source].
   *   * [drawImage](http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#dom-context-2d-drawimage)
   * from the WHATWG.
   */
  @DomName('CanvasRenderingContext2D.drawImage')
  void drawImage(CanvasImageSource source, num destinationX, num destinationY) {
    $dom_drawImage(source, destinationX, destinationY);
  }

  /**
   * Draws an image from a CanvasImageSource to an area of this canvas.
   *
   * The image will be drawn to an area of this canvas defined by
   * [destinationRect]. If [sourceRect] is not provided, then
   * the entire rectangular image from [source] will be drawn to this context.
   * If the dimensions of [source] or [sourceRect]
   * differ from [destinationRect], then the image will be scaled to fit.
   * If the image is larger than canvas
   * will allow, the image will be cropped to fit the available space.
   *
   *     CanvasElement canvas = new CanvasElement(width: 600, height: 600);
   *     CanvasRenderingContext2D ctx = canvas.context2d;
   *     ImageElement img = document.query('img');
   *     img.width = 100;
   *     img.height = 100;
   *
   *     // Scale the image to 20x20.
   *     ctx.drawImageAtScale(img, new Rect(50, 50, 20, 20));
   *
   *     VideoElement video = document.query('video');
   *     video.width = 100;
   *     video.height = 100;
   *     // Take the middle 20x20 pixels from the video and stretch them.
   *     ctx.drawImageAtScale(video, new Rect(50, 50, 100, 100),
   *         sourceRect: new Rect(40, 40, 20, 20));
   *
   *     // Draw the top 100x20 pixels from the otherCanvas.
   *     CanvasElement otherCanvas = document.query('canvas');
   *     ctx.drawImageAtScale(otherCanvas, new Rect(0, 0, 100, 20),
   *         sourceRect: new Rect(0, 0, 100, 20));
   *
   * See also:
   *
   *   * [CanvasImageSource] for more information on what data is retrieved
   * from [source].
   *   * [drawImage](http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#dom-context-2d-drawimage)
   * from the WHATWG.
   */
  @DomName('CanvasRenderingContext2D.drawImage')
  void drawImageAtScale(CanvasImageSource source, Rect destinationRect,
      {Rect sourceRect}) {
    if (sourceRect == null) {
      $dom_drawImage(source,
          destinationRect.left,
          destinationRect.top,
          destinationRect.width,
          destinationRect.height);
    } else {
      $dom_drawImage(source,
          sourceRect.left,
          sourceRect.top,
          sourceRect.width,
          sourceRect.height,
          destinationRect.left,
          destinationRect.top,
          destinationRect.width,
          destinationRect.height);
    }
  }

}
// 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.


@DocsEditable
@DomName('CharacterData')
class CharacterData extends Node {
  CharacterData.internal() : super.internal();

  @DomName('CharacterData.data')
  @DocsEditable
  String get data native "CharacterData_data_Getter";

  @DomName('CharacterData.data')
  @DocsEditable
  void set data(String value) native "CharacterData_data_Setter";

  @DomName('CharacterData.length')
  @DocsEditable
  int get length native "CharacterData_length_Getter";

  @DomName('CharacterData.appendData')
  @DocsEditable
  void appendData(String data) native "CharacterData_appendData_Callback";

  @DomName('CharacterData.deleteData')
  @DocsEditable
  void deleteData(int offset, int length) native "CharacterData_deleteData_Callback";

  @DomName('CharacterData.insertData')
  @DocsEditable
  void insertData(int offset, String data) native "CharacterData_insertData_Callback";

  @DomName('CharacterData.replaceData')
  @DocsEditable
  void replaceData(int offset, int length, String data) native "CharacterData_replaceData_Callback";

  @DomName('CharacterData.substringData')
  @DocsEditable
  String substringData(int offset, int length) native "CharacterData_substringData_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('CloseEvent')
class CloseEvent extends Event {
  CloseEvent.internal() : super.internal();

  @DomName('CloseEvent.code')
  @DocsEditable
  int get code native "CloseEvent_code_Getter";

  @DomName('CloseEvent.reason')
  @DocsEditable
  String get reason native "CloseEvent_reason_Getter";

  @DomName('CloseEvent.wasClean')
  @DocsEditable
  bool get wasClean native "CloseEvent_wasClean_Getter";

}
// 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.


@DocsEditable
@DomName('Comment')
class Comment extends CharacterData {
  Comment.internal() : super.internal();

}
// 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.


@DomName('CompositionEvent')
class CompositionEvent extends UIEvent {
  factory CompositionEvent(String type,
      {bool canBubble: false, bool cancelable: false, Window view,
      String data}) {
    if (view == null) {
      view = window;
    }
    var e = document.$dom_createEvent("CompositionEvent");
    e.$dom_initCompositionEvent(type, canBubble, cancelable, view, data);
    return e;
  }
  CompositionEvent.internal() : super.internal();

  @DomName('CompositionEvent.data')
  @DocsEditable
  String get data native "CompositionEvent_data_Getter";

  @DomName('CompositionEvent.initCompositionEvent')
  @DocsEditable
  void $dom_initCompositionEvent(String typeArg, bool canBubbleArg, bool cancelableArg, Window viewArg, String dataArg) native "CompositionEvent_initCompositionEvent_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('Console')
class Console extends NativeFieldWrapperClass1 {
  Console.internal();

  @DomName('Console.memory')
  @DocsEditable
  MemoryInfo get memory native "Console_memory_Getter";

  @DomName('Console.profiles')
  @DocsEditable
  List<ScriptProfile> get profiles native "Console_profiles_Getter";

  @DomName('Console.assertCondition')
  @DocsEditable
  void assertCondition(bool condition, Object arg) native "Console_assertCondition_Callback";

  @DomName('Console.clear')
  @DocsEditable
  void clear(Object arg) native "Console_clear_Callback";

  @DomName('Console.count')
  @DocsEditable
  void count(Object arg) native "Console_count_Callback";

  @DomName('Console.debug')
  @DocsEditable
  void debug(Object arg) native "Console_debug_Callback";

  @DomName('Console.dir')
  @DocsEditable
  void dir(Object arg) native "Console_dir_Callback";

  @DomName('Console.dirxml')
  @DocsEditable
  void dirxml(Object arg) native "Console_dirxml_Callback";

  @DomName('Console.error')
  @DocsEditable
  void error(Object arg) native "Console_error_Callback";

  @DomName('Console.group')
  @DocsEditable
  void group(Object arg) native "Console_group_Callback";

  @DomName('Console.groupCollapsed')
  @DocsEditable
  void groupCollapsed(Object arg) native "Console_groupCollapsed_Callback";

  @DomName('Console.groupEnd')
  @DocsEditable
  void groupEnd() native "Console_groupEnd_Callback";

  @DomName('Console.info')
  @DocsEditable
  void info(Object arg) native "Console_info_Callback";

  @DomName('Console.log')
  @DocsEditable
  void log(Object arg) native "Console_log_Callback";

  @DomName('Console.markTimeline')
  @DocsEditable
  void markTimeline() native "Console_markTimeline_Callback";

  @DomName('Console.profile')
  @DocsEditable
  void profile(String title) native "Console_profile_Callback";

  @DomName('Console.profileEnd')
  @DocsEditable
  void profileEnd(String title) native "Console_profileEnd_Callback";

  @DomName('Console.table')
  @DocsEditable
  void table(Object arg) native "Console_table_Callback";

  @DomName('Console.time')
  @DocsEditable
  void time(String title) native "Console_time_Callback";

  @DomName('Console.timeEnd')
  @DocsEditable
  void timeEnd(String title) native "Console_timeEnd_Callback";

  @DomName('Console.timeStamp')
  @DocsEditable
  void timeStamp() native "Console_timeStamp_Callback";

  @DomName('Console.trace')
  @DocsEditable
  void trace(Object arg) native "Console_trace_Callback";

  @DomName('Console.warn')
  @DocsEditable
  void warn(Object arg) native "Console_warn_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('HTMLContentElement')
@SupportedBrowser(SupportedBrowser.CHROME, '26')
@Experimental
class ContentElement extends _Element_Merged {
  ContentElement.internal() : super.internal();

  @DomName('HTMLContentElement.HTMLContentElement')
  @DocsEditable
  factory ContentElement() => document.$dom_createElement("content");

  /// Checks if this type is supported on the current platform.
  static bool get supported => true;

  @DomName('HTMLContentElement.resetStyleInheritance')
  @DocsEditable
  bool get resetStyleInheritance native "HTMLContentElement_resetStyleInheritance_Getter";

  @DomName('HTMLContentElement.resetStyleInheritance')
  @DocsEditable
  void set resetStyleInheritance(bool value) native "HTMLContentElement_resetStyleInheritance_Setter";

  @DomName('HTMLContentElement.select')
  @DocsEditable
  String get select native "HTMLContentElement_select_Getter";

  @DomName('HTMLContentElement.select')
  @DocsEditable
  void set select(String value) native "HTMLContentElement_select_Setter";

  @DomName('HTMLContentElement.getDistributedNodes')
  @DocsEditable
  List<Node> getDistributedNodes() native "HTMLContentElement_getDistributedNodes_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('Coordinates')
class Coordinates extends NativeFieldWrapperClass1 {
  Coordinates.internal();

  @DomName('Coordinates.accuracy')
  @DocsEditable
  num get accuracy native "Coordinates_accuracy_Getter";

  @DomName('Coordinates.altitude')
  @DocsEditable
  num get altitude native "Coordinates_altitude_Getter";

  @DomName('Coordinates.altitudeAccuracy')
  @DocsEditable
  num get altitudeAccuracy native "Coordinates_altitudeAccuracy_Getter";

  @DomName('Coordinates.heading')
  @DocsEditable
  num get heading native "Coordinates_heading_Getter";

  @DomName('Coordinates.latitude')
  @DocsEditable
  num get latitude native "Coordinates_latitude_Getter";

  @DomName('Coordinates.longitude')
  @DocsEditable
  num get longitude native "Coordinates_longitude_Getter";

  @DomName('Coordinates.speed')
  @DocsEditable
  num get speed native "Coordinates_speed_Getter";

}
// 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.


@DocsEditable
@DomName('Counter')
class Counter extends NativeFieldWrapperClass1 {
  Counter.internal();

  @DomName('Counter.identifier')
  @DocsEditable
  String get identifier native "Counter_identifier_Getter";

  @DomName('Counter.listStyle')
  @DocsEditable
  String get listStyle native "Counter_listStyle_Getter";

  @DomName('Counter.separator')
  @DocsEditable
  String get separator native "Counter_separator_Getter";

}
// 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.


@DocsEditable
@DomName('Crypto')
@SupportedBrowser(SupportedBrowser.CHROME)
@SupportedBrowser(SupportedBrowser.SAFARI)
@Experimental
class Crypto extends NativeFieldWrapperClass1 {
  Crypto.internal();

  /// Checks if this type is supported on the current platform.
  static bool get supported => true;

  @DomName('Crypto.getRandomValues')
  @DocsEditable
  dynamic getRandomValues(/*ArrayBufferView*/ array) native "Crypto_getRandomValues_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('CSSCharsetRule')
class CssCharsetRule extends CssRule {
  CssCharsetRule.internal() : super.internal();

  @DomName('CSSCharsetRule.encoding')
  @DocsEditable
  String get encoding native "CSSCharsetRule_encoding_Getter";

  @DomName('CSSCharsetRule.encoding')
  @DocsEditable
  void set encoding(String value) native "CSSCharsetRule_encoding_Setter";

}
// 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.


@DocsEditable
@DomName('CSSFontFaceRule')
class CssFontFaceRule extends CssRule {
  CssFontFaceRule.internal() : super.internal();

  @DomName('CSSFontFaceRule.style')
  @DocsEditable
  CssStyleDeclaration get style native "CSSFontFaceRule_style_Getter";

}
// 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.


@DocsEditable
@DomName('CSSHostRule')
@SupportedBrowser(SupportedBrowser.CHROME, '26')
@Experimental
class CssHostRule extends CssRule {
  CssHostRule.internal() : super.internal();

  @DomName('CSSHostRule.cssRules')
  @DocsEditable
  List<CssRule> get cssRules native "CSSHostRule_cssRules_Getter";

  @DomName('CSSHostRule.deleteRule')
  @DocsEditable
  void deleteRule(int index) native "CSSHostRule_deleteRule_Callback";

  @DomName('CSSHostRule.insertRule')
  @DocsEditable
  int insertRule(String rule, int index) native "CSSHostRule_insertRule_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('CSSImportRule')
class CssImportRule extends CssRule {
  CssImportRule.internal() : super.internal();

  @DomName('CSSImportRule.href')
  @DocsEditable
  String get href native "CSSImportRule_href_Getter";

  @DomName('CSSImportRule.media')
  @DocsEditable
  MediaList get media native "CSSImportRule_media_Getter";

  @DomName('CSSImportRule.styleSheet')
  @DocsEditable
  CssStyleSheet get styleSheet native "CSSImportRule_styleSheet_Getter";

}
// 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.


@DocsEditable
@DomName('WebKitCSSKeyframeRule')
class CssKeyframeRule extends CssRule {
  CssKeyframeRule.internal() : super.internal();

  @DomName('WebKitCSSKeyframeRule.keyText')
  @DocsEditable
  String get keyText native "WebKitCSSKeyframeRule_keyText_Getter";

  @DomName('WebKitCSSKeyframeRule.keyText')
  @DocsEditable
  void set keyText(String value) native "WebKitCSSKeyframeRule_keyText_Setter";

  @DomName('WebKitCSSKeyframeRule.style')
  @DocsEditable
  CssStyleDeclaration get style native "WebKitCSSKeyframeRule_style_Getter";

}
// 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.


@DocsEditable
@DomName('WebKitCSSKeyframesRule')
class CssKeyframesRule extends CssRule {
  CssKeyframesRule.internal() : super.internal();

  @DomName('WebKitCSSKeyframesRule.cssRules')
  @DocsEditable
  List<CssRule> get cssRules native "WebKitCSSKeyframesRule_cssRules_Getter";

  @DomName('WebKitCSSKeyframesRule.name')
  @DocsEditable
  String get name native "WebKitCSSKeyframesRule_name_Getter";

  @DomName('WebKitCSSKeyframesRule.name')
  @DocsEditable
  void set name(String value) native "WebKitCSSKeyframesRule_name_Setter";

  @DomName('WebKitCSSKeyframesRule.deleteRule')
  @DocsEditable
  void deleteRule(String key) native "WebKitCSSKeyframesRule_deleteRule_Callback";

  @DomName('WebKitCSSKeyframesRule.findRule')
  @DocsEditable
  CssKeyframeRule findRule(String key) native "WebKitCSSKeyframesRule_findRule_Callback";

  @DomName('WebKitCSSKeyframesRule.insertRule')
  @DocsEditable
  void insertRule(String rule) native "WebKitCSSKeyframesRule_insertRule_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('WebKitCSSMatrix')
@SupportedBrowser(SupportedBrowser.CHROME)
@SupportedBrowser(SupportedBrowser.SAFARI)
@Experimental
class CssMatrix extends NativeFieldWrapperClass1 {
  CssMatrix.internal();

  @DomName('WebKitCSSMatrix.WebKitCSSMatrix')
  @DocsEditable
  factory CssMatrix([String cssValue]) {
    return CssMatrix._create_1(cssValue);
  }

  @DocsEditable
  static CssMatrix _create_1(cssValue) native "WebKitCSSMatrix__create_1constructorCallback";

  /// Checks if this type is supported on the current platform.
  static bool get supported => true;

  @DomName('WebKitCSSMatrix.a')
  @DocsEditable
  num get a native "WebKitCSSMatrix_a_Getter";

  @DomName('WebKitCSSMatrix.a')
  @DocsEditable
  void set a(num value) native "WebKitCSSMatrix_a_Setter";

  @DomName('WebKitCSSMatrix.b')
  @DocsEditable
  num get b native "WebKitCSSMatrix_b_Getter";

  @DomName('WebKitCSSMatrix.b')
  @DocsEditable
  void set b(num value) native "WebKitCSSMatrix_b_Setter";

  @DomName('WebKitCSSMatrix.c')
  @DocsEditable
  num get c native "WebKitCSSMatrix_c_Getter";

  @DomName('WebKitCSSMatrix.c')
  @DocsEditable
  void set c(num value) native "WebKitCSSMatrix_c_Setter";

  @DomName('WebKitCSSMatrix.d')
  @DocsEditable
  num get d native "WebKitCSSMatrix_d_Getter";

  @DomName('WebKitCSSMatrix.d')
  @DocsEditable
  void set d(num value) native "WebKitCSSMatrix_d_Setter";

  @DomName('WebKitCSSMatrix.e')
  @DocsEditable
  num get e native "WebKitCSSMatrix_e_Getter";

  @DomName('WebKitCSSMatrix.e')
  @DocsEditable
  void set e(num value) native "WebKitCSSMatrix_e_Setter";

  @DomName('WebKitCSSMatrix.f')
  @DocsEditable
  num get f native "WebKitCSSMatrix_f_Getter";

  @DomName('WebKitCSSMatrix.f')
  @DocsEditable
  void set f(num value) native "WebKitCSSMatrix_f_Setter";

  @DomName('WebKitCSSMatrix.m11')
  @DocsEditable
  num get m11 native "WebKitCSSMatrix_m11_Getter";

  @DomName('WebKitCSSMatrix.m11')
  @DocsEditable
  void set m11(num value) native "WebKitCSSMatrix_m11_Setter";

  @DomName('WebKitCSSMatrix.m12')
  @DocsEditable
  num get m12 native "WebKitCSSMatrix_m12_Getter";

  @DomName('WebKitCSSMatrix.m12')
  @DocsEditable
  void set m12(num value) native "WebKitCSSMatrix_m12_Setter";

  @DomName('WebKitCSSMatrix.m13')
  @DocsEditable
  num get m13 native "WebKitCSSMatrix_m13_Getter";

  @DomName('WebKitCSSMatrix.m13')
  @DocsEditable
  void set m13(num value) native "WebKitCSSMatrix_m13_Setter";

  @DomName('WebKitCSSMatrix.m14')
  @DocsEditable
  num get m14 native "WebKitCSSMatrix_m14_Getter";

  @DomName('WebKitCSSMatrix.m14')
  @DocsEditable
  void set m14(num value) native "WebKitCSSMatrix_m14_Setter";

  @DomName('WebKitCSSMatrix.m21')
  @DocsEditable
  num get m21 native "WebKitCSSMatrix_m21_Getter";

  @DomName('WebKitCSSMatrix.m21')
  @DocsEditable
  void set m21(num value) native "WebKitCSSMatrix_m21_Setter";

  @DomName('WebKitCSSMatrix.m22')
  @DocsEditable
  num get m22 native "WebKitCSSMatrix_m22_Getter";

  @DomName('WebKitCSSMatrix.m22')
  @DocsEditable
  void set m22(num value) native "WebKitCSSMatrix_m22_Setter";

  @DomName('WebKitCSSMatrix.m23')
  @DocsEditable
  num get m23 native "WebKitCSSMatrix_m23_Getter";

  @DomName('WebKitCSSMatrix.m23')
  @DocsEditable
  void set m23(num value) native "WebKitCSSMatrix_m23_Setter";

  @DomName('WebKitCSSMatrix.m24')
  @DocsEditable
  num get m24 native "WebKitCSSMatrix_m24_Getter";

  @DomName('WebKitCSSMatrix.m24')
  @DocsEditable
  void set m24(num value) native "WebKitCSSMatrix_m24_Setter";

  @DomName('WebKitCSSMatrix.m31')
  @DocsEditable
  num get m31 native "WebKitCSSMatrix_m31_Getter";

  @DomName('WebKitCSSMatrix.m31')
  @DocsEditable
  void set m31(num value) native "WebKitCSSMatrix_m31_Setter";

  @DomName('WebKitCSSMatrix.m32')
  @DocsEditable
  num get m32 native "WebKitCSSMatrix_m32_Getter";

  @DomName('WebKitCSSMatrix.m32')
  @DocsEditable
  void set m32(num value) native "WebKitCSSMatrix_m32_Setter";

  @DomName('WebKitCSSMatrix.m33')
  @DocsEditable
  num get m33 native "WebKitCSSMatrix_m33_Getter";

  @DomName('WebKitCSSMatrix.m33')
  @DocsEditable
  void set m33(num value) native "WebKitCSSMatrix_m33_Setter";

  @DomName('WebKitCSSMatrix.m34')
  @DocsEditable
  num get m34 native "WebKitCSSMatrix_m34_Getter";

  @DomName('WebKitCSSMatrix.m34')
  @DocsEditable
  void set m34(num value) native "WebKitCSSMatrix_m34_Setter";

  @DomName('WebKitCSSMatrix.m41')
  @DocsEditable
  num get m41 native "WebKitCSSMatrix_m41_Getter";

  @DomName('WebKitCSSMatrix.m41')
  @DocsEditable
  void set m41(num value) native "WebKitCSSMatrix_m41_Setter";

  @DomName('WebKitCSSMatrix.m42')
  @DocsEditable
  num get m42 native "WebKitCSSMatrix_m42_Getter";

  @DomName('WebKitCSSMatrix.m42')
  @DocsEditable
  void set m42(num value) native "WebKitCSSMatrix_m42_Setter";

  @DomName('WebKitCSSMatrix.m43')
  @DocsEditable
  num get m43 native "WebKitCSSMatrix_m43_Getter";

  @DomName('WebKitCSSMatrix.m43')
  @DocsEditable
  void set m43(num value) native "WebKitCSSMatrix_m43_Setter";

  @DomName('WebKitCSSMatrix.m44')
  @DocsEditable
  num get m44 native "WebKitCSSMatrix_m44_Getter";

  @DomName('WebKitCSSMatrix.m44')
  @DocsEditable
  void set m44(num value) native "WebKitCSSMatrix_m44_Setter";

  @DomName('WebKitCSSMatrix.inverse')
  @DocsEditable
  CssMatrix inverse() native "WebKitCSSMatrix_inverse_Callback";

  @DomName('WebKitCSSMatrix.multiply')
  @DocsEditable
  CssMatrix multiply(CssMatrix secondMatrix) native "WebKitCSSMatrix_multiply_Callback";

  @DomName('WebKitCSSMatrix.rotate')
  @DocsEditable
  CssMatrix rotate(num rotX, num rotY, num rotZ) native "WebKitCSSMatrix_rotate_Callback";

  @DomName('WebKitCSSMatrix.rotateAxisAngle')
  @DocsEditable
  CssMatrix rotateAxisAngle(num x, num y, num z, num angle) native "WebKitCSSMatrix_rotateAxisAngle_Callback";

  @DomName('WebKitCSSMatrix.scale')
  @DocsEditable
  CssMatrix scale(num scaleX, num scaleY, num scaleZ) native "WebKitCSSMatrix_scale_Callback";

  @DomName('WebKitCSSMatrix.setMatrixValue')
  @DocsEditable
  void setMatrixValue(String string) native "WebKitCSSMatrix_setMatrixValue_Callback";

  @DomName('WebKitCSSMatrix.skewX')
  @DocsEditable
  CssMatrix skewX(num angle) native "WebKitCSSMatrix_skewX_Callback";

  @DomName('WebKitCSSMatrix.skewY')
  @DocsEditable
  CssMatrix skewY(num angle) native "WebKitCSSMatrix_skewY_Callback";

  @DomName('WebKitCSSMatrix.toString')
  @DocsEditable
  String toString() native "WebKitCSSMatrix_toString_Callback";

  @DomName('WebKitCSSMatrix.translate')
  @DocsEditable
  CssMatrix translate(num x, num y, num z) native "WebKitCSSMatrix_translate_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('CSSMediaRule')
class CssMediaRule extends CssRule {
  CssMediaRule.internal() : super.internal();

  @DomName('CSSMediaRule.cssRules')
  @DocsEditable
  List<CssRule> get cssRules native "CSSMediaRule_cssRules_Getter";

  @DomName('CSSMediaRule.media')
  @DocsEditable
  MediaList get media native "CSSMediaRule_media_Getter";

  @DomName('CSSMediaRule.deleteRule')
  @DocsEditable
  void deleteRule(int index) native "CSSMediaRule_deleteRule_Callback";

  @DomName('CSSMediaRule.insertRule')
  @DocsEditable
  int insertRule(String rule, int index) native "CSSMediaRule_insertRule_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('CSSPageRule')
class CssPageRule extends CssRule {
  CssPageRule.internal() : super.internal();

  @DomName('CSSPageRule.selectorText')
  @DocsEditable
  String get selectorText native "CSSPageRule_selectorText_Getter";

  @DomName('CSSPageRule.selectorText')
  @DocsEditable
  void set selectorText(String value) native "CSSPageRule_selectorText_Setter";

  @DomName('CSSPageRule.style')
  @DocsEditable
  CssStyleDeclaration get style native "CSSPageRule_style_Getter";

}
// 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.


@DocsEditable
@DomName('CSSPrimitiveValue')
class CssPrimitiveValue extends CssValue {
  CssPrimitiveValue.internal() : super.internal();

  static const int CSS_ATTR = 22;

  static const int CSS_CM = 6;

  static const int CSS_COUNTER = 23;

  static const int CSS_DEG = 11;

  static const int CSS_DIMENSION = 18;

  static const int CSS_EMS = 3;

  static const int CSS_EXS = 4;

  static const int CSS_GRAD = 13;

  static const int CSS_HZ = 16;

  static const int CSS_IDENT = 21;

  static const int CSS_IN = 8;

  static const int CSS_KHZ = 17;

  static const int CSS_MM = 7;

  static const int CSS_MS = 14;

  static const int CSS_NUMBER = 1;

  static const int CSS_PC = 10;

  static const int CSS_PERCENTAGE = 2;

  static const int CSS_PT = 9;

  static const int CSS_PX = 5;

  static const int CSS_RAD = 12;

  static const int CSS_RECT = 24;

  static const int CSS_RGBCOLOR = 25;

  static const int CSS_S = 15;

  static const int CSS_STRING = 19;

  static const int CSS_UNKNOWN = 0;

  static const int CSS_URI = 20;

  static const int CSS_VH = 27;

  static const int CSS_VMAX = 29;

  static const int CSS_VMIN = 28;

  static const int CSS_VW = 26;

  @DomName('CSSPrimitiveValue.primitiveType')
  @DocsEditable
  int get primitiveType native "CSSPrimitiveValue_primitiveType_Getter";

  @DomName('CSSPrimitiveValue.getCounterValue')
  @DocsEditable
  Counter getCounterValue() native "CSSPrimitiveValue_getCounterValue_Callback";

  @DomName('CSSPrimitiveValue.getFloatValue')
  @DocsEditable
  num getFloatValue(int unitType) native "CSSPrimitiveValue_getFloatValue_Callback";

  @DomName('CSSPrimitiveValue.getRGBColorValue')
  @DocsEditable
  CssRgbColor getRgbColorValue() native "CSSPrimitiveValue_getRGBColorValue_Callback";

  @DomName('CSSPrimitiveValue.getRectValue')
  @DocsEditable
  CssRect getRectValue() native "CSSPrimitiveValue_getRectValue_Callback";

  @DomName('CSSPrimitiveValue.getStringValue')
  @DocsEditable
  String getStringValue() native "CSSPrimitiveValue_getStringValue_Callback";

  @DomName('CSSPrimitiveValue.setFloatValue')
  @DocsEditable
  void setFloatValue(int unitType, num floatValue) native "CSSPrimitiveValue_setFloatValue_Callback";

  @DomName('CSSPrimitiveValue.setStringValue')
  @DocsEditable
  void setStringValue(int stringType, String stringValue) native "CSSPrimitiveValue_setStringValue_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('Rect')
class CssRect extends NativeFieldWrapperClass1 {
  CssRect.internal();

  @DomName('Rect.bottom')
  @DocsEditable
  CssPrimitiveValue get bottom native "Rect_bottom_Getter";

  @DomName('Rect.left')
  @DocsEditable
  CssPrimitiveValue get left native "Rect_left_Getter";

  @DomName('Rect.right')
  @DocsEditable
  CssPrimitiveValue get right native "Rect_right_Getter";

  @DomName('Rect.top')
  @DocsEditable
  CssPrimitiveValue get top native "Rect_top_Getter";

}
// 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.


@DocsEditable
@DomName('RGBColor')
class CssRgbColor extends NativeFieldWrapperClass1 {
  CssRgbColor.internal();

  @DomName('RGBColor.blue')
  @DocsEditable
  CssPrimitiveValue get blue native "RGBColor_blue_Getter";

  @DomName('RGBColor.green')
  @DocsEditable
  CssPrimitiveValue get green native "RGBColor_green_Getter";

  @DomName('RGBColor.red')
  @DocsEditable
  CssPrimitiveValue get red native "RGBColor_red_Getter";

}
// 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.


@DocsEditable
@DomName('CSSRule')
class CssRule extends NativeFieldWrapperClass1 {
  CssRule.internal();

  static const int CHARSET_RULE = 2;

  static const int FONT_FACE_RULE = 5;

  static const int HOST_RULE = 1001;

  static const int IMPORT_RULE = 3;

  static const int MEDIA_RULE = 4;

  static const int PAGE_RULE = 6;

  static const int STYLE_RULE = 1;

  static const int UNKNOWN_RULE = 0;

  static const int WEBKIT_FILTER_RULE = 17;

  static const int WEBKIT_KEYFRAMES_RULE = 7;

  static const int WEBKIT_KEYFRAME_RULE = 8;

  @DomName('CSSRule.cssText')
  @DocsEditable
  String get cssText native "CSSRule_cssText_Getter";

  @DomName('CSSRule.cssText')
  @DocsEditable
  void set cssText(String value) native "CSSRule_cssText_Setter";

  @DomName('CSSRule.parentRule')
  @DocsEditable
  CssRule get parentRule native "CSSRule_parentRule_Getter";

  @DomName('CSSRule.parentStyleSheet')
  @DocsEditable
  CssStyleSheet get parentStyleSheet native "CSSRule_parentStyleSheet_Getter";

  @DomName('CSSRule.type')
  @DocsEditable
  int get type native "CSSRule_type_Getter";

}
// 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('CSSStyleDeclaration')
class CssStyleDeclaration extends NativeFieldWrapperClass1 {
  factory CssStyleDeclaration() => _CssStyleDeclarationFactoryProvider.createCssStyleDeclaration();
  factory CssStyleDeclaration.css(String css) =>
      _CssStyleDeclarationFactoryProvider.createCssStyleDeclaration_css(css);

  CssStyleDeclaration.internal();

  @DomName('CSSStyleDeclaration.cssText')
  @DocsEditable
  String get cssText native "CSSStyleDeclaration_cssText_Getter";

  @DomName('CSSStyleDeclaration.cssText')
  @DocsEditable
  void set cssText(String value) native "CSSStyleDeclaration_cssText_Setter";

  @DomName('CSSStyleDeclaration.length')
  @DocsEditable
  int get length native "CSSStyleDeclaration_length_Getter";

  @DomName('CSSStyleDeclaration.parentRule')
  @DocsEditable
  CssRule get parentRule native "CSSStyleDeclaration_parentRule_Getter";

  @DomName('CSSStyleDeclaration.getPropertyCSSValue')
  @DocsEditable
  CssValue getPropertyCssValue(String propertyName) native "CSSStyleDeclaration_getPropertyCSSValue_Callback";

  @DomName('CSSStyleDeclaration.getPropertyPriority')
  @DocsEditable
  String getPropertyPriority(String propertyName) native "CSSStyleDeclaration_getPropertyPriority_Callback";

  @DomName('CSSStyleDeclaration.getPropertyShorthand')
  @DocsEditable
  String getPropertyShorthand(String propertyName) native "CSSStyleDeclaration_getPropertyShorthand_Callback";

  @DomName('CSSStyleDeclaration._getPropertyValue')
  @DocsEditable
  String _getPropertyValue(String propertyName) native "CSSStyleDeclaration__getPropertyValue_Callback";

  @DomName('CSSStyleDeclaration.isPropertyImplicit')
  @DocsEditable
  bool isPropertyImplicit(String propertyName) native "CSSStyleDeclaration_isPropertyImplicit_Callback";

  @DomName('CSSStyleDeclaration.item')
  @DocsEditable
  String item(int index) native "CSSStyleDeclaration_item_Callback";

  @DomName('CSSStyleDeclaration.removeProperty')
  @DocsEditable
  String removeProperty(String propertyName) native "CSSStyleDeclaration_removeProperty_Callback";

  @DomName('CSSStyleDeclaration.setProperty')
  @DocsEditable
  void setProperty(String propertyName, String value, [String priority]) native "CSSStyleDeclaration_setProperty_Callback";


  String getPropertyValue(String propertyName) {
    var propValue = _getPropertyValue(propertyName);
    return propValue != null ? propValue : '';
  }

  /**
   * Checks to see if CSS Transitions are supported.
   */
  static bool get supportsTransitions => true;

  // TODO(jacobr): generate this list of properties using the existing script.
  /** Gets the value of "align-content" */
  String get alignContent =>
    getPropertyValue('${Device.cssPrefix}align-content');

  /** Sets the value of "align-content" */
  void set alignContent(String value) {
    setProperty('${Device.cssPrefix}align-content', value, '');
  }

  /** Gets the value of "align-items" */
  String get alignItems =>
    getPropertyValue('${Device.cssPrefix}align-items');

  /** Sets the value of "align-items" */
  void set alignItems(String value) {
    setProperty('${Device.cssPrefix}align-items', value, '');
  }

  /** Gets the value of "align-self" */
  String get alignSelf =>
    getPropertyValue('${Device.cssPrefix}align-self');

  /** Sets the value of "align-self" */
  void set alignSelf(String value) {
    setProperty('${Device.cssPrefix}align-self', value, '');
  }

  /** Gets the value of "animation" */
  String get animation =>
    getPropertyValue('${Device.cssPrefix}animation');

  /** Sets the value of "animation" */
  void set animation(String value) {
    setProperty('${Device.cssPrefix}animation', value, '');
  }

  /** Gets the value of "animation-delay" */
  String get animationDelay =>
    getPropertyValue('${Device.cssPrefix}animation-delay');

  /** Sets the value of "animation-delay" */
  void set animationDelay(String value) {
    setProperty('${Device.cssPrefix}animation-delay', value, '');
  }

  /** Gets the value of "animation-direction" */
  String get animationDirection =>
    getPropertyValue('${Device.cssPrefix}animation-direction');

  /** Sets the value of "animation-direction" */
  void set animationDirection(String value) {
    setProperty('${Device.cssPrefix}animation-direction', value, '');
  }

  /** Gets the value of "animation-duration" */
  String get animationDuration =>
    getPropertyValue('${Device.cssPrefix}animation-duration');

  /** Sets the value of "animation-duration" */
  void set animationDuration(String value) {
    setProperty('${Device.cssPrefix}animation-duration', value, '');
  }

  /** Gets the value of "animation-fill-mode" */
  String get animationFillMode =>
    getPropertyValue('${Device.cssPrefix}animation-fill-mode');

  /** Sets the value of "animation-fill-mode" */
  void set animationFillMode(String value) {
    setProperty('${Device.cssPrefix}animation-fill-mode', value, '');
  }

  /** Gets the value of "animation-iteration-count" */
  String get animationIterationCount =>
    getPropertyValue('${Device.cssPrefix}animation-iteration-count');

  /** Sets the value of "animation-iteration-count" */
  void set animationIterationCount(String value) {
    setProperty('${Device.cssPrefix}animation-iteration-count', value, '');
  }

  /** Gets the value of "animation-name" */
  String get animationName =>
    getPropertyValue('${Device.cssPrefix}animation-name');

  /** Sets the value of "animation-name" */
  void set animationName(String value) {
    setProperty('${Device.cssPrefix}animation-name', value, '');
  }

  /** Gets the value of "animation-play-state" */
  String get animationPlayState =>
    getPropertyValue('${Device.cssPrefix}animation-play-state');

  /** Sets the value of "animation-play-state" */
  void set animationPlayState(String value) {
    setProperty('${Device.cssPrefix}animation-play-state', value, '');
  }

  /** Gets the value of "animation-timing-function" */
  String get animationTimingFunction =>
    getPropertyValue('${Device.cssPrefix}animation-timing-function');

  /** Sets the value of "animation-timing-function" */
  void set animationTimingFunction(String value) {
    setProperty('${Device.cssPrefix}animation-timing-function', value, '');
  }

  /** Gets the value of "app-region" */
  String get appRegion =>
    getPropertyValue('${Device.cssPrefix}app-region');

  /** Sets the value of "app-region" */
  void set appRegion(String value) {
    setProperty('${Device.cssPrefix}app-region', value, '');
  }

  /** Gets the value of "appearance" */
  String get appearance =>
    getPropertyValue('${Device.cssPrefix}appearance');

  /** Sets the value of "appearance" */
  void set appearance(String value) {
    setProperty('${Device.cssPrefix}appearance', value, '');
  }

  /** Gets the value of "aspect-ratio" */
  String get aspectRatio =>
    getPropertyValue('${Device.cssPrefix}aspect-ratio');

  /** Sets the value of "aspect-ratio" */
  void set aspectRatio(String value) {
    setProperty('${Device.cssPrefix}aspect-ratio', value, '');
  }

  /** Gets the value of "backface-visibility" */
  String get backfaceVisibility =>
    getPropertyValue('${Device.cssPrefix}backface-visibility');

  /** Sets the value of "backface-visibility" */
  void set backfaceVisibility(String value) {
    setProperty('${Device.cssPrefix}backface-visibility', value, '');
  }

  /** Gets the value of "background" */
  String get background =>
    getPropertyValue('background');

  /** Sets the value of "background" */
  void 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" */
  void set backgroundAttachment(String value) {
    setProperty('background-attachment', value, '');
  }

  /** Gets the value of "background-clip" */
  String get backgroundClip =>
    getPropertyValue('background-clip');

  /** Sets the value of "background-clip" */
  void 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" */
  void set backgroundColor(String value) {
    setProperty('background-color', value, '');
  }

  /** Gets the value of "background-composite" */
  String get backgroundComposite =>
    getPropertyValue('${Device.cssPrefix}background-composite');

  /** Sets the value of "background-composite" */
  void set backgroundComposite(String value) {
    setProperty('${Device.cssPrefix}background-composite', value, '');
  }

  /** Gets the value of "background-image" */
  String get backgroundImage =>
    getPropertyValue('background-image');

  /** Sets the value of "background-image" */
  void 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" */
  void 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" */
  void 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" */
  void 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" */
  void 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" */
  void 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" */
  void 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" */
  void 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" */
  void set backgroundSize(String value) {
    setProperty('background-size', value, '');
  }

  /** Gets the value of "blend-mode" */
  String get blendMode =>
    getPropertyValue('${Device.cssPrefix}blend-mode');

  /** Sets the value of "blend-mode" */
  void set blendMode(String value) {
    setProperty('${Device.cssPrefix}blend-mode', value, '');
  }

  /** Gets the value of "border" */
  String get border =>
    getPropertyValue('border');

  /** Sets the value of "border" */
  void set border(String value) {
    setProperty('border', value, '');
  }

  /** Gets the value of "border-after" */
  String get borderAfter =>
    getPropertyValue('${Device.cssPrefix}border-after');

  /** Sets the value of "border-after" */
  void set borderAfter(String value) {
    setProperty('${Device.cssPrefix}border-after', value, '');
  }

  /** Gets the value of "border-after-color" */
  String get borderAfterColor =>
    getPropertyValue('${Device.cssPrefix}border-after-color');

  /** Sets the value of "border-after-color" */
  void set borderAfterColor(String value) {
    setProperty('${Device.cssPrefix}border-after-color', value, '');
  }

  /** Gets the value of "border-after-style" */
  String get borderAfterStyle =>
    getPropertyValue('${Device.cssPrefix}border-after-style');

  /** Sets the value of "border-after-style" */
  void set borderAfterStyle(String value) {
    setProperty('${Device.cssPrefix}border-after-style', value, '');
  }

  /** Gets the value of "border-after-width" */
  String get borderAfterWidth =>
    getPropertyValue('${Device.cssPrefix}border-after-width');

  /** Sets the value of "border-after-width" */
  void set borderAfterWidth(String value) {
    setProperty('${Device.cssPrefix}border-after-width', value, '');
  }

  /** Gets the value of "border-before" */
  String get borderBefore =>
    getPropertyValue('${Device.cssPrefix}border-before');

  /** Sets the value of "border-before" */
  void set borderBefore(String value) {
    setProperty('${Device.cssPrefix}border-before', value, '');
  }

  /** Gets the value of "border-before-color" */
  String get borderBeforeColor =>
    getPropertyValue('${Device.cssPrefix}border-before-color');

  /** Sets the value of "border-before-color" */
  void set borderBeforeColor(String value) {
    setProperty('${Device.cssPrefix}border-before-color', value, '');
  }

  /** Gets the value of "border-before-style" */
  String get borderBeforeStyle =>
    getPropertyValue('${Device.cssPrefix}border-before-style');

  /** Sets the value of "border-before-style" */
  void set borderBeforeStyle(String value) {
    setProperty('${Device.cssPrefix}border-before-style', value, '');
  }

  /** Gets the value of "border-before-width" */
  String get borderBeforeWidth =>
    getPropertyValue('${Device.cssPrefix}border-before-width');

  /** Sets the value of "border-before-width" */
  void set borderBeforeWidth(String value) {
    setProperty('${Device.cssPrefix}border-before-width', value, '');
  }

  /** Gets the value of "border-bottom" */
  String get borderBottom =>
    getPropertyValue('border-bottom');

  /** Sets the value of "border-bottom" */
  void 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" */
  void 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" */
  void 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" */
  void 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" */
  void 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" */
  void 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" */
  void 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" */
  void set borderColor(String value) {
    setProperty('border-color', value, '');
  }

  /** Gets the value of "border-end" */
  String get borderEnd =>
    getPropertyValue('${Device.cssPrefix}border-end');

  /** Sets the value of "border-end" */
  void set borderEnd(String value) {
    setProperty('${Device.cssPrefix}border-end', value, '');
  }

  /** Gets the value of "border-end-color" */
  String get borderEndColor =>
    getPropertyValue('${Device.cssPrefix}border-end-color');

  /** Sets the value of "border-end-color" */
  void set borderEndColor(String value) {
    setProperty('${Device.cssPrefix}border-end-color', value, '');
  }

  /** Gets the value of "border-end-style" */
  String get borderEndStyle =>
    getPropertyValue('${Device.cssPrefix}border-end-style');

  /** Sets the value of "border-end-style" */
  void set borderEndStyle(String value) {
    setProperty('${Device.cssPrefix}border-end-style', value, '');
  }

  /** Gets the value of "border-end-width" */
  String get borderEndWidth =>
    getPropertyValue('${Device.cssPrefix}border-end-width');

  /** Sets the value of "border-end-width" */
  void set borderEndWidth(String value) {
    setProperty('${Device.cssPrefix}border-end-width', value, '');
  }

  /** Gets the value of "border-fit" */
  String get borderFit =>
    getPropertyValue('${Device.cssPrefix}border-fit');

  /** Sets the value of "border-fit" */
  void set borderFit(String value) {
    setProperty('${Device.cssPrefix}border-fit', value, '');
  }

  /** Gets the value of "border-horizontal-spacing" */
  String get borderHorizontalSpacing =>
    getPropertyValue('${Device.cssPrefix}border-horizontal-spacing');

  /** Sets the value of "border-horizontal-spacing" */
  void set borderHorizontalSpacing(String value) {
    setProperty('${Device.cssPrefix}border-horizontal-spacing', value, '');
  }

  /** Gets the value of "border-image" */
  String get borderImage =>
    getPropertyValue('border-image');

  /** Sets the value of "border-image" */
  void 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" */
  void 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" */
  void 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" */
  void 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" */
  void 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" */
  void 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" */
  void 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" */
  void 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" */
  void 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" */
  void 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" */
  void 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" */
  void 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" */
  void 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" */
  void 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" */
  void 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" */
  void set borderSpacing(String value) {
    setProperty('border-spacing', value, '');
  }

  /** Gets the value of "border-start" */
  String get borderStart =>
    getPropertyValue('${Device.cssPrefix}border-start');

  /** Sets the value of "border-start" */
  void set borderStart(String value) {
    setProperty('${Device.cssPrefix}border-start', value, '');
  }

  /** Gets the value of "border-start-color" */
  String get borderStartColor =>
    getPropertyValue('${Device.cssPrefix}border-start-color');

  /** Sets the value of "border-start-color" */
  void set borderStartColor(String value) {
    setProperty('${Device.cssPrefix}border-start-color', value, '');
  }

  /** Gets the value of "border-start-style" */
  String get borderStartStyle =>
    getPropertyValue('${Device.cssPrefix}border-start-style');

  /** Sets the value of "border-start-style" */
  void set borderStartStyle(String value) {
    setProperty('${Device.cssPrefix}border-start-style', value, '');
  }

  /** Gets the value of "border-start-width" */
  String get borderStartWidth =>
    getPropertyValue('${Device.cssPrefix}border-start-width');

  /** Sets the value of "border-start-width" */
  void set borderStartWidth(String value) {
    setProperty('${Device.cssPrefix}border-start-width', value, '');
  }

  /** Gets the value of "border-style" */
  String get borderStyle =>
    getPropertyValue('border-style');

  /** Sets the value of "border-style" */
  void 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" */
  void 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" */
  void 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" */
  void 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" */
  void 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" */
  void 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" */
  void set borderTopWidth(String value) {
    setProperty('border-top-width', value, '');
  }

  /** Gets the value of "border-vertical-spacing" */
  String get borderVerticalSpacing =>
    getPropertyValue('${Device.cssPrefix}border-vertical-spacing');

  /** Sets the value of "border-vertical-spacing" */
  void set borderVerticalSpacing(String value) {
    setProperty('${Device.cssPrefix}border-vertical-spacing', value, '');
  }

  /** Gets the value of "border-width" */
  String get borderWidth =>
    getPropertyValue('border-width');

  /** Sets the value of "border-width" */
  void set borderWidth(String value) {
    setProperty('border-width', value, '');
  }

  /** Gets the value of "bottom" */
  String get bottom =>
    getPropertyValue('bottom');

  /** Sets the value of "bottom" */
  void set bottom(String value) {
    setProperty('bottom', value, '');
  }

  /** Gets the value of "box-align" */
  String get boxAlign =>
    getPropertyValue('${Device.cssPrefix}box-align');

  /** Sets the value of "box-align" */
  void set boxAlign(String value) {
    setProperty('${Device.cssPrefix}box-align', value, '');
  }

  /** Gets the value of "box-decoration-break" */
  String get boxDecorationBreak =>
    getPropertyValue('${Device.cssPrefix}box-decoration-break');

  /** Sets the value of "box-decoration-break" */
  void set boxDecorationBreak(String value) {
    setProperty('${Device.cssPrefix}box-decoration-break', value, '');
  }

  /** Gets the value of "box-direction" */
  String get boxDirection =>
    getPropertyValue('${Device.cssPrefix}box-direction');

  /** Sets the value of "box-direction" */
  void set boxDirection(String value) {
    setProperty('${Device.cssPrefix}box-direction', value, '');
  }

  /** Gets the value of "box-flex" */
  String get boxFlex =>
    getPropertyValue('${Device.cssPrefix}box-flex');

  /** Sets the value of "box-flex" */
  void set boxFlex(String value) {
    setProperty('${Device.cssPrefix}box-flex', value, '');
  }

  /** Gets the value of "box-flex-group" */
  String get boxFlexGroup =>
    getPropertyValue('${Device.cssPrefix}box-flex-group');

  /** Sets the value of "box-flex-group" */
  void set boxFlexGroup(String value) {
    setProperty('${Device.cssPrefix}box-flex-group', value, '');
  }

  /** Gets the value of "box-lines" */
  String get boxLines =>
    getPropertyValue('${Device.cssPrefix}box-lines');

  /** Sets the value of "box-lines" */
  void set boxLines(String value) {
    setProperty('${Device.cssPrefix}box-lines', value, '');
  }

  /** Gets the value of "box-ordinal-group" */
  String get boxOrdinalGroup =>
    getPropertyValue('${Device.cssPrefix}box-ordinal-group');

  /** Sets the value of "box-ordinal-group" */
  void set boxOrdinalGroup(String value) {
    setProperty('${Device.cssPrefix}box-ordinal-group', value, '');
  }

  /** Gets the value of "box-orient" */
  String get boxOrient =>
    getPropertyValue('${Device.cssPrefix}box-orient');

  /** Sets the value of "box-orient" */
  void set boxOrient(String value) {
    setProperty('${Device.cssPrefix}box-orient', value, '');
  }

  /** Gets the value of "box-pack" */
  String get boxPack =>
    getPropertyValue('${Device.cssPrefix}box-pack');

  /** Sets the value of "box-pack" */
  void set boxPack(String value) {
    setProperty('${Device.cssPrefix}box-pack', value, '');
  }

  /** Gets the value of "box-reflect" */
  String get boxReflect =>
    getPropertyValue('${Device.cssPrefix}box-reflect');

  /** Sets the value of "box-reflect" */
  void set boxReflect(String value) {
    setProperty('${Device.cssPrefix}box-reflect', value, '');
  }

  /** Gets the value of "box-shadow" */
  String get boxShadow =>
    getPropertyValue('box-shadow');

  /** Sets the value of "box-shadow" */
  void 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" */
  void 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" */
  void set captionSide(String value) {
    setProperty('caption-side', value, '');
  }

  /** Gets the value of "clear" */
  String get clear =>
    getPropertyValue('clear');

  /** Sets the value of "clear" */
  void set clear(String value) {
    setProperty('clear', value, '');
  }

  /** Gets the value of "clip" */
  String get clip =>
    getPropertyValue('clip');

  /** Sets the value of "clip" */
  void set clip(String value) {
    setProperty('clip', value, '');
  }

  /** Gets the value of "clip-path" */
  String get clipPath =>
    getPropertyValue('${Device.cssPrefix}clip-path');

  /** Sets the value of "clip-path" */
  void set clipPath(String value) {
    setProperty('${Device.cssPrefix}clip-path', value, '');
  }

  /** Gets the value of "color" */
  String get color =>
    getPropertyValue('color');

  /** Sets the value of "color" */
  void set color(String value) {
    setProperty('color', value, '');
  }

  /** Gets the value of "color-correction" */
  String get colorCorrection =>
    getPropertyValue('${Device.cssPrefix}color-correction');

  /** Sets the value of "color-correction" */
  void set colorCorrection(String value) {
    setProperty('${Device.cssPrefix}color-correction', value, '');
  }

  /** Gets the value of "column-axis" */
  String get columnAxis =>
    getPropertyValue('${Device.cssPrefix}column-axis');

  /** Sets the value of "column-axis" */
  void set columnAxis(String value) {
    setProperty('${Device.cssPrefix}column-axis', value, '');
  }

  /** Gets the value of "column-break-after" */
  String get columnBreakAfter =>
    getPropertyValue('${Device.cssPrefix}column-break-after');

  /** Sets the value of "column-break-after" */
  void set columnBreakAfter(String value) {
    setProperty('${Device.cssPrefix}column-break-after', value, '');
  }

  /** Gets the value of "column-break-before" */
  String get columnBreakBefore =>
    getPropertyValue('${Device.cssPrefix}column-break-before');

  /** Sets the value of "column-break-before" */
  void set columnBreakBefore(String value) {
    setProperty('${Device.cssPrefix}column-break-before', value, '');
  }

  /** Gets the value of "column-break-inside" */
  String get columnBreakInside =>
    getPropertyValue('${Device.cssPrefix}column-break-inside');

  /** Sets the value of "column-break-inside" */
  void set columnBreakInside(String value) {
    setProperty('${Device.cssPrefix}column-break-inside', value, '');
  }

  /** Gets the value of "column-count" */
  String get columnCount =>
    getPropertyValue('${Device.cssPrefix}column-count');

  /** Sets the value of "column-count" */
  void set columnCount(String value) {
    setProperty('${Device.cssPrefix}column-count', value, '');
  }

  /** Gets the value of "column-gap" */
  String get columnGap =>
    getPropertyValue('${Device.cssPrefix}column-gap');

  /** Sets the value of "column-gap" */
  void set columnGap(String value) {
    setProperty('${Device.cssPrefix}column-gap', value, '');
  }

  /** Gets the value of "column-progression" */
  String get columnProgression =>
    getPropertyValue('${Device.cssPrefix}column-progression');

  /** Sets the value of "column-progression" */
  void set columnProgression(String value) {
    setProperty('${Device.cssPrefix}column-progression', value, '');
  }

  /** Gets the value of "column-rule" */
  String get columnRule =>
    getPropertyValue('${Device.cssPrefix}column-rule');

  /** Sets the value of "column-rule" */
  void set columnRule(String value) {
    setProperty('${Device.cssPrefix}column-rule', value, '');
  }

  /** Gets the value of "column-rule-color" */
  String get columnRuleColor =>
    getPropertyValue('${Device.cssPrefix}column-rule-color');

  /** Sets the value of "column-rule-color" */
  void set columnRuleColor(String value) {
    setProperty('${Device.cssPrefix}column-rule-color', value, '');
  }

  /** Gets the value of "column-rule-style" */
  String get columnRuleStyle =>
    getPropertyValue('${Device.cssPrefix}column-rule-style');

  /** Sets the value of "column-rule-style" */
  void set columnRuleStyle(String value) {
    setProperty('${Device.cssPrefix}column-rule-style', value, '');
  }

  /** Gets the value of "column-rule-width" */
  String get columnRuleWidth =>
    getPropertyValue('${Device.cssPrefix}column-rule-width');

  /** Sets the value of "column-rule-width" */
  void set columnRuleWidth(String value) {
    setProperty('${Device.cssPrefix}column-rule-width', value, '');
  }

  /** Gets the value of "column-span" */
  String get columnSpan =>
    getPropertyValue('${Device.cssPrefix}column-span');

  /** Sets the value of "column-span" */
  void set columnSpan(String value) {
    setProperty('${Device.cssPrefix}column-span', value, '');
  }

  /** Gets the value of "column-width" */
  String get columnWidth =>
    getPropertyValue('${Device.cssPrefix}column-width');

  /** Sets the value of "column-width" */
  void set columnWidth(String value) {
    setProperty('${Device.cssPrefix}column-width', value, '');
  }

  /** Gets the value of "columns" */
  String get columns =>
    getPropertyValue('${Device.cssPrefix}columns');

  /** Sets the value of "columns" */
  void set columns(String value) {
    setProperty('${Device.cssPrefix}columns', value, '');
  }

  /** Gets the value of "content" */
  String get content =>
    getPropertyValue('content');

  /** Sets the value of "content" */
  void 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" */
  void 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" */
  void set counterReset(String value) {
    setProperty('counter-reset', value, '');
  }

  /** Gets the value of "cursor" */
  String get cursor =>
    getPropertyValue('cursor');

  /** Sets the value of "cursor" */
  void set cursor(String value) {
    setProperty('cursor', value, '');
  }

  /** Gets the value of "dashboard-region" */
  String get dashboardRegion =>
    getPropertyValue('${Device.cssPrefix}dashboard-region');

  /** Sets the value of "dashboard-region" */
  void set dashboardRegion(String value) {
    setProperty('${Device.cssPrefix}dashboard-region', value, '');
  }

  /** Gets the value of "direction" */
  String get direction =>
    getPropertyValue('direction');

  /** Sets the value of "direction" */
  void set direction(String value) {
    setProperty('direction', value, '');
  }

  /** Gets the value of "display" */
  String get display =>
    getPropertyValue('display');

  /** Sets the value of "display" */
  void 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" */
  void set emptyCells(String value) {
    setProperty('empty-cells', value, '');
  }

  /** Gets the value of "filter" */
  String get filter =>
    getPropertyValue('${Device.cssPrefix}filter');

  /** Sets the value of "filter" */
  void set filter(String value) {
    setProperty('${Device.cssPrefix}filter', value, '');
  }

  /** Gets the value of "flex" */
  String get flex =>
    getPropertyValue('${Device.cssPrefix}flex');

  /** Sets the value of "flex" */
  void set flex(String value) {
    setProperty('${Device.cssPrefix}flex', value, '');
  }

  /** Gets the value of "flex-basis" */
  String get flexBasis =>
    getPropertyValue('${Device.cssPrefix}flex-basis');

  /** Sets the value of "flex-basis" */
  void set flexBasis(String value) {
    setProperty('${Device.cssPrefix}flex-basis', value, '');
  }

  /** Gets the value of "flex-direction" */
  String get flexDirection =>
    getPropertyValue('${Device.cssPrefix}flex-direction');

  /** Sets the value of "flex-direction" */
  void set flexDirection(String value) {
    setProperty('${Device.cssPrefix}flex-direction', value, '');
  }

  /** Gets the value of "flex-flow" */
  String get flexFlow =>
    getPropertyValue('${Device.cssPrefix}flex-flow');

  /** Sets the value of "flex-flow" */
  void set flexFlow(String value) {
    setProperty('${Device.cssPrefix}flex-flow', value, '');
  }

  /** Gets the value of "flex-grow" */
  String get flexGrow =>
    getPropertyValue('${Device.cssPrefix}flex-grow');

  /** Sets the value of "flex-grow" */
  void set flexGrow(String value) {
    setProperty('${Device.cssPrefix}flex-grow', value, '');
  }

  /** Gets the value of "flex-shrink" */
  String get flexShrink =>
    getPropertyValue('${Device.cssPrefix}flex-shrink');

  /** Sets the value of "flex-shrink" */
  void set flexShrink(String value) {
    setProperty('${Device.cssPrefix}flex-shrink', value, '');
  }

  /** Gets the value of "flex-wrap" */
  String get flexWrap =>
    getPropertyValue('${Device.cssPrefix}flex-wrap');

  /** Sets the value of "flex-wrap" */
  void set flexWrap(String value) {
    setProperty('${Device.cssPrefix}flex-wrap', value, '');
  }

  /** Gets the value of "float" */
  String get float =>
    getPropertyValue('float');

  /** Sets the value of "float" */
  void set float(String value) {
    setProperty('float', value, '');
  }

  /** Gets the value of "flow-from" */
  String get flowFrom =>
    getPropertyValue('${Device.cssPrefix}flow-from');

  /** Sets the value of "flow-from" */
  void set flowFrom(String value) {
    setProperty('${Device.cssPrefix}flow-from', value, '');
  }

  /** Gets the value of "flow-into" */
  String get flowInto =>
    getPropertyValue('${Device.cssPrefix}flow-into');

  /** Sets the value of "flow-into" */
  void set flowInto(String value) {
    setProperty('${Device.cssPrefix}flow-into', value, '');
  }

  /** Gets the value of "font" */
  String get font =>
    getPropertyValue('font');

  /** Sets the value of "font" */
  void 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" */
  void set fontFamily(String value) {
    setProperty('font-family', value, '');
  }

  /** Gets the value of "font-feature-settings" */
  String get fontFeatureSettings =>
    getPropertyValue('${Device.cssPrefix}font-feature-settings');

  /** Sets the value of "font-feature-settings" */
  void set fontFeatureSettings(String value) {
    setProperty('${Device.cssPrefix}font-feature-settings', value, '');
  }

  /** Gets the value of "font-kerning" */
  String get fontKerning =>
    getPropertyValue('${Device.cssPrefix}font-kerning');

  /** Sets the value of "font-kerning" */
  void set fontKerning(String value) {
    setProperty('${Device.cssPrefix}font-kerning', value, '');
  }

  /** Gets the value of "font-size" */
  String get fontSize =>
    getPropertyValue('font-size');

  /** Sets the value of "font-size" */
  void set fontSize(String value) {
    setProperty('font-size', value, '');
  }

  /** Gets the value of "font-size-delta" */
  String get fontSizeDelta =>
    getPropertyValue('${Device.cssPrefix}font-size-delta');

  /** Sets the value of "font-size-delta" */
  void set fontSizeDelta(String value) {
    setProperty('${Device.cssPrefix}font-size-delta', value, '');
  }

  /** Gets the value of "font-smoothing" */
  String get fontSmoothing =>
    getPropertyValue('${Device.cssPrefix}font-smoothing');

  /** Sets the value of "font-smoothing" */
  void set fontSmoothing(String value) {
    setProperty('${Device.cssPrefix}font-smoothing', value, '');
  }

  /** Gets the value of "font-stretch" */
  String get fontStretch =>
    getPropertyValue('font-stretch');

  /** Sets the value of "font-stretch" */
  void 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" */
  void 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" */
  void set fontVariant(String value) {
    setProperty('font-variant', value, '');
  }

  /** Gets the value of "font-variant-ligatures" */
  String get fontVariantLigatures =>
    getPropertyValue('${Device.cssPrefix}font-variant-ligatures');

  /** Sets the value of "font-variant-ligatures" */
  void set fontVariantLigatures(String value) {
    setProperty('${Device.cssPrefix}font-variant-ligatures', value, '');
  }

  /** Gets the value of "font-weight" */
  String get fontWeight =>
    getPropertyValue('font-weight');

  /** Sets the value of "font-weight" */
  void set fontWeight(String value) {
    setProperty('font-weight', value, '');
  }

  /** Gets the value of "grid-column" */
  String get gridColumn =>
    getPropertyValue('${Device.cssPrefix}grid-column');

  /** Sets the value of "grid-column" */
  void set gridColumn(String value) {
    setProperty('${Device.cssPrefix}grid-column', value, '');
  }

  /** Gets the value of "grid-columns" */
  String get gridColumns =>
    getPropertyValue('${Device.cssPrefix}grid-columns');

  /** Sets the value of "grid-columns" */
  void set gridColumns(String value) {
    setProperty('${Device.cssPrefix}grid-columns', value, '');
  }

  /** Gets the value of "grid-row" */
  String get gridRow =>
    getPropertyValue('${Device.cssPrefix}grid-row');

  /** Sets the value of "grid-row" */
  void set gridRow(String value) {
    setProperty('${Device.cssPrefix}grid-row', value, '');
  }

  /** Gets the value of "grid-rows" */
  String get gridRows =>
    getPropertyValue('${Device.cssPrefix}grid-rows');

  /** Sets the value of "grid-rows" */
  void set gridRows(String value) {
    setProperty('${Device.cssPrefix}grid-rows', value, '');
  }

  /** Gets the value of "height" */
  String get height =>
    getPropertyValue('height');

  /** Sets the value of "height" */
  void set height(String value) {
    setProperty('height', value, '');
  }

  /** Gets the value of "highlight" */
  String get highlight =>
    getPropertyValue('${Device.cssPrefix}highlight');

  /** Sets the value of "highlight" */
  void set highlight(String value) {
    setProperty('${Device.cssPrefix}highlight', value, '');
  }

  /** Gets the value of "hyphenate-character" */
  String get hyphenateCharacter =>
    getPropertyValue('${Device.cssPrefix}hyphenate-character');

  /** Sets the value of "hyphenate-character" */
  void set hyphenateCharacter(String value) {
    setProperty('${Device.cssPrefix}hyphenate-character', value, '');
  }

  /** Gets the value of "hyphenate-limit-after" */
  String get hyphenateLimitAfter =>
    getPropertyValue('${Device.cssPrefix}hyphenate-limit-after');

  /** Sets the value of "hyphenate-limit-after" */
  void set hyphenateLimitAfter(String value) {
    setProperty('${Device.cssPrefix}hyphenate-limit-after', value, '');
  }

  /** Gets the value of "hyphenate-limit-before" */
  String get hyphenateLimitBefore =>
    getPropertyValue('${Device.cssPrefix}hyphenate-limit-before');

  /** Sets the value of "hyphenate-limit-before" */
  void set hyphenateLimitBefore(String value) {
    setProperty('${Device.cssPrefix}hyphenate-limit-before', value, '');
  }

  /** Gets the value of "hyphenate-limit-lines" */
  String get hyphenateLimitLines =>
    getPropertyValue('${Device.cssPrefix}hyphenate-limit-lines');

  /** Sets the value of "hyphenate-limit-lines" */
  void set hyphenateLimitLines(String value) {
    setProperty('${Device.cssPrefix}hyphenate-limit-lines', value, '');
  }

  /** Gets the value of "hyphens" */
  String get hyphens =>
    getPropertyValue('${Device.cssPrefix}hyphens');

  /** Sets the value of "hyphens" */
  void set hyphens(String value) {
    setProperty('${Device.cssPrefix}hyphens', value, '');
  }

  /** Gets the value of "image-orientation" */
  String get imageOrientation =>
    getPropertyValue('image-orientation');

  /** Sets the value of "image-orientation" */
  void set imageOrientation(String value) {
    setProperty('image-orientation', value, '');
  }

  /** Gets the value of "image-rendering" */
  String get imageRendering =>
    getPropertyValue('image-rendering');

  /** Sets the value of "image-rendering" */
  void set imageRendering(String value) {
    setProperty('image-rendering', value, '');
  }

  /** Gets the value of "image-resolution" */
  String get imageResolution =>
    getPropertyValue('image-resolution');

  /** Sets the value of "image-resolution" */
  void set imageResolution(String value) {
    setProperty('image-resolution', value, '');
  }

  /** Gets the value of "justify-content" */
  String get justifyContent =>
    getPropertyValue('${Device.cssPrefix}justify-content');

  /** Sets the value of "justify-content" */
  void set justifyContent(String value) {
    setProperty('${Device.cssPrefix}justify-content', value, '');
  }

  /** Gets the value of "left" */
  String get left =>
    getPropertyValue('left');

  /** Sets the value of "left" */
  void 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" */
  void set letterSpacing(String value) {
    setProperty('letter-spacing', value, '');
  }

  /** Gets the value of "line-align" */
  String get lineAlign =>
    getPropertyValue('${Device.cssPrefix}line-align');

  /** Sets the value of "line-align" */
  void set lineAlign(String value) {
    setProperty('${Device.cssPrefix}line-align', value, '');
  }

  /** Gets the value of "line-box-contain" */
  String get lineBoxContain =>
    getPropertyValue('${Device.cssPrefix}line-box-contain');

  /** Sets the value of "line-box-contain" */
  void set lineBoxContain(String value) {
    setProperty('${Device.cssPrefix}line-box-contain', value, '');
  }

  /** Gets the value of "line-break" */
  String get lineBreak =>
    getPropertyValue('${Device.cssPrefix}line-break');

  /** Sets the value of "line-break" */
  void set lineBreak(String value) {
    setProperty('${Device.cssPrefix}line-break', value, '');
  }

  /** Gets the value of "line-clamp" */
  String get lineClamp =>
    getPropertyValue('${Device.cssPrefix}line-clamp');

  /** Sets the value of "line-clamp" */
  void set lineClamp(String value) {
    setProperty('${Device.cssPrefix}line-clamp', value, '');
  }

  /** Gets the value of "line-grid" */
  String get lineGrid =>
    getPropertyValue('${Device.cssPrefix}line-grid');

  /** Sets the value of "line-grid" */
  void set lineGrid(String value) {
    setProperty('${Device.cssPrefix}line-grid', value, '');
  }

  /** Gets the value of "line-height" */
  String get lineHeight =>
    getPropertyValue('line-height');

  /** Sets the value of "line-height" */
  void set lineHeight(String value) {
    setProperty('line-height', value, '');
  }

  /** Gets the value of "line-snap" */
  String get lineSnap =>
    getPropertyValue('${Device.cssPrefix}line-snap');

  /** Sets the value of "line-snap" */
  void set lineSnap(String value) {
    setProperty('${Device.cssPrefix}line-snap', value, '');
  }

  /** Gets the value of "list-style" */
  String get listStyle =>
    getPropertyValue('list-style');

  /** Sets the value of "list-style" */
  void 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" */
  void 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" */
  void 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" */
  void set listStyleType(String value) {
    setProperty('list-style-type', value, '');
  }

  /** Gets the value of "locale" */
  String get locale =>
    getPropertyValue('${Device.cssPrefix}locale');

  /** Sets the value of "locale" */
  void set locale(String value) {
    setProperty('${Device.cssPrefix}locale', value, '');
  }

  /** Gets the value of "logical-height" */
  String get logicalHeight =>
    getPropertyValue('${Device.cssPrefix}logical-height');

  /** Sets the value of "logical-height" */
  void set logicalHeight(String value) {
    setProperty('${Device.cssPrefix}logical-height', value, '');
  }

  /** Gets the value of "logical-width" */
  String get logicalWidth =>
    getPropertyValue('${Device.cssPrefix}logical-width');

  /** Sets the value of "logical-width" */
  void set logicalWidth(String value) {
    setProperty('${Device.cssPrefix}logical-width', value, '');
  }

  /** Gets the value of "margin" */
  String get margin =>
    getPropertyValue('margin');

  /** Sets the value of "margin" */
  void set margin(String value) {
    setProperty('margin', value, '');
  }

  /** Gets the value of "margin-after" */
  String get marginAfter =>
    getPropertyValue('${Device.cssPrefix}margin-after');

  /** Sets the value of "margin-after" */
  void set marginAfter(String value) {
    setProperty('${Device.cssPrefix}margin-after', value, '');
  }

  /** Gets the value of "margin-after-collapse" */
  String get marginAfterCollapse =>
    getPropertyValue('${Device.cssPrefix}margin-after-collapse');

  /** Sets the value of "margin-after-collapse" */
  void set marginAfterCollapse(String value) {
    setProperty('${Device.cssPrefix}margin-after-collapse', value, '');
  }

  /** Gets the value of "margin-before" */
  String get marginBefore =>
    getPropertyValue('${Device.cssPrefix}margin-before');

  /** Sets the value of "margin-before" */
  void set marginBefore(String value) {
    setProperty('${Device.cssPrefix}margin-before', value, '');
  }

  /** Gets the value of "margin-before-collapse" */
  String get marginBeforeCollapse =>
    getPropertyValue('${Device.cssPrefix}margin-before-collapse');

  /** Sets the value of "margin-before-collapse" */
  void set marginBeforeCollapse(String value) {
    setProperty('${Device.cssPrefix}margin-before-collapse', value, '');
  }

  /** Gets the value of "margin-bottom" */
  String get marginBottom =>
    getPropertyValue('margin-bottom');

  /** Sets the value of "margin-bottom" */
  void set marginBottom(String value) {
    setProperty('margin-bottom', value, '');
  }

  /** Gets the value of "margin-bottom-collapse" */
  String get marginBottomCollapse =>
    getPropertyValue('${Device.cssPrefix}margin-bottom-collapse');

  /** Sets the value of "margin-bottom-collapse" */
  void set marginBottomCollapse(String value) {
    setProperty('${Device.cssPrefix}margin-bottom-collapse', value, '');
  }

  /** Gets the value of "margin-collapse" */
  String get marginCollapse =>
    getPropertyValue('${Device.cssPrefix}margin-collapse');

  /** Sets the value of "margin-collapse" */
  void set marginCollapse(String value) {
    setProperty('${Device.cssPrefix}margin-collapse', value, '');
  }

  /** Gets the value of "margin-end" */
  String get marginEnd =>
    getPropertyValue('${Device.cssPrefix}margin-end');

  /** Sets the value of "margin-end" */
  void set marginEnd(String value) {
    setProperty('${Device.cssPrefix}margin-end', value, '');
  }

  /** Gets the value of "margin-left" */
  String get marginLeft =>
    getPropertyValue('margin-left');

  /** Sets the value of "margin-left" */
  void 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" */
  void set marginRight(String value) {
    setProperty('margin-right', value, '');
  }

  /** Gets the value of "margin-start" */
  String get marginStart =>
    getPropertyValue('${Device.cssPrefix}margin-start');

  /** Sets the value of "margin-start" */
  void set marginStart(String value) {
    setProperty('${Device.cssPrefix}margin-start', value, '');
  }

  /** Gets the value of "margin-top" */
  String get marginTop =>
    getPropertyValue('margin-top');

  /** Sets the value of "margin-top" */
  void set marginTop(String value) {
    setProperty('margin-top', value, '');
  }

  /** Gets the value of "margin-top-collapse" */
  String get marginTopCollapse =>
    getPropertyValue('${Device.cssPrefix}margin-top-collapse');

  /** Sets the value of "margin-top-collapse" */
  void set marginTopCollapse(String value) {
    setProperty('${Device.cssPrefix}margin-top-collapse', value, '');
  }

  /** Gets the value of "marquee" */
  String get marquee =>
    getPropertyValue('${Device.cssPrefix}marquee');

  /** Sets the value of "marquee" */
  void set marquee(String value) {
    setProperty('${Device.cssPrefix}marquee', value, '');
  }

  /** Gets the value of "marquee-direction" */
  String get marqueeDirection =>
    getPropertyValue('${Device.cssPrefix}marquee-direction');

  /** Sets the value of "marquee-direction" */
  void set marqueeDirection(String value) {
    setProperty('${Device.cssPrefix}marquee-direction', value, '');
  }

  /** Gets the value of "marquee-increment" */
  String get marqueeIncrement =>
    getPropertyValue('${Device.cssPrefix}marquee-increment');

  /** Sets the value of "marquee-increment" */
  void set marqueeIncrement(String value) {
    setProperty('${Device.cssPrefix}marquee-increment', value, '');
  }

  /** Gets the value of "marquee-repetition" */
  String get marqueeRepetition =>
    getPropertyValue('${Device.cssPrefix}marquee-repetition');

  /** Sets the value of "marquee-repetition" */
  void set marqueeRepetition(String value) {
    setProperty('${Device.cssPrefix}marquee-repetition', value, '');
  }

  /** Gets the value of "marquee-speed" */
  String get marqueeSpeed =>
    getPropertyValue('${Device.cssPrefix}marquee-speed');

  /** Sets the value of "marquee-speed" */
  void set marqueeSpeed(String value) {
    setProperty('${Device.cssPrefix}marquee-speed', value, '');
  }

  /** Gets the value of "marquee-style" */
  String get marqueeStyle =>
    getPropertyValue('${Device.cssPrefix}marquee-style');

  /** Sets the value of "marquee-style" */
  void set marqueeStyle(String value) {
    setProperty('${Device.cssPrefix}marquee-style', value, '');
  }

  /** Gets the value of "mask" */
  String get mask =>
    getPropertyValue('${Device.cssPrefix}mask');

  /** Sets the value of "mask" */
  void set mask(String value) {
    setProperty('${Device.cssPrefix}mask', value, '');
  }

  /** Gets the value of "mask-attachment" */
  String get maskAttachment =>
    getPropertyValue('${Device.cssPrefix}mask-attachment');

  /** Sets the value of "mask-attachment" */
  void set maskAttachment(String value) {
    setProperty('${Device.cssPrefix}mask-attachment', value, '');
  }

  /** Gets the value of "mask-box-image" */
  String get maskBoxImage =>
    getPropertyValue('${Device.cssPrefix}mask-box-image');

  /** Sets the value of "mask-box-image" */
  void set maskBoxImage(String value) {
    setProperty('${Device.cssPrefix}mask-box-image', value, '');
  }

  /** Gets the value of "mask-box-image-outset" */
  String get maskBoxImageOutset =>
    getPropertyValue('${Device.cssPrefix}mask-box-image-outset');

  /** Sets the value of "mask-box-image-outset" */
  void set maskBoxImageOutset(String value) {
    setProperty('${Device.cssPrefix}mask-box-image-outset', value, '');
  }

  /** Gets the value of "mask-box-image-repeat" */
  String get maskBoxImageRepeat =>
    getPropertyValue('${Device.cssPrefix}mask-box-image-repeat');

  /** Sets the value of "mask-box-image-repeat" */
  void set maskBoxImageRepeat(String value) {
    setProperty('${Device.cssPrefix}mask-box-image-repeat', value, '');
  }

  /** Gets the value of "mask-box-image-slice" */
  String get maskBoxImageSlice =>
    getPropertyValue('${Device.cssPrefix}mask-box-image-slice');

  /** Sets the value of "mask-box-image-slice" */
  void set maskBoxImageSlice(String value) {
    setProperty('${Device.cssPrefix}mask-box-image-slice', value, '');
  }

  /** Gets the value of "mask-box-image-source" */
  String get maskBoxImageSource =>
    getPropertyValue('${Device.cssPrefix}mask-box-image-source');

  /** Sets the value of "mask-box-image-source" */
  void set maskBoxImageSource(String value) {
    setProperty('${Device.cssPrefix}mask-box-image-source', value, '');
  }

  /** Gets the value of "mask-box-image-width" */
  String get maskBoxImageWidth =>
    getPropertyValue('${Device.cssPrefix}mask-box-image-width');

  /** Sets the value of "mask-box-image-width" */
  void set maskBoxImageWidth(String value) {
    setProperty('${Device.cssPrefix}mask-box-image-width', value, '');
  }

  /** Gets the value of "mask-clip" */
  String get maskClip =>
    getPropertyValue('${Device.cssPrefix}mask-clip');

  /** Sets the value of "mask-clip" */
  void set maskClip(String value) {
    setProperty('${Device.cssPrefix}mask-clip', value, '');
  }

  /** Gets the value of "mask-composite" */
  String get maskComposite =>
    getPropertyValue('${Device.cssPrefix}mask-composite');

  /** Sets the value of "mask-composite" */
  void set maskComposite(String value) {
    setProperty('${Device.cssPrefix}mask-composite', value, '');
  }

  /** Gets the value of "mask-image" */
  String get maskImage =>
    getPropertyValue('${Device.cssPrefix}mask-image');

  /** Sets the value of "mask-image" */
  void set maskImage(String value) {
    setProperty('${Device.cssPrefix}mask-image', value, '');
  }

  /** Gets the value of "mask-origin" */
  String get maskOrigin =>
    getPropertyValue('${Device.cssPrefix}mask-origin');

  /** Sets the value of "mask-origin" */
  void set maskOrigin(String value) {
    setProperty('${Device.cssPrefix}mask-origin', value, '');
  }

  /** Gets the value of "mask-position" */
  String get maskPosition =>
    getPropertyValue('${Device.cssPrefix}mask-position');

  /** Sets the value of "mask-position" */
  void set maskPosition(String value) {
    setProperty('${Device.cssPrefix}mask-position', value, '');
  }

  /** Gets the value of "mask-position-x" */
  String get maskPositionX =>
    getPropertyValue('${Device.cssPrefix}mask-position-x');

  /** Sets the value of "mask-position-x" */
  void set maskPositionX(String value) {
    setProperty('${Device.cssPrefix}mask-position-x', value, '');
  }

  /** Gets the value of "mask-position-y" */
  String get maskPositionY =>
    getPropertyValue('${Device.cssPrefix}mask-position-y');

  /** Sets the value of "mask-position-y" */
  void set maskPositionY(String value) {
    setProperty('${Device.cssPrefix}mask-position-y', value, '');
  }

  /** Gets the value of "mask-repeat" */
  String get maskRepeat =>
    getPropertyValue('${Device.cssPrefix}mask-repeat');

  /** Sets the value of "mask-repeat" */
  void set maskRepeat(String value) {
    setProperty('${Device.cssPrefix}mask-repeat', value, '');
  }

  /** Gets the value of "mask-repeat-x" */
  String get maskRepeatX =>
    getPropertyValue('${Device.cssPrefix}mask-repeat-x');

  /** Sets the value of "mask-repeat-x" */
  void set maskRepeatX(String value) {
    setProperty('${Device.cssPrefix}mask-repeat-x', value, '');
  }

  /** Gets the value of "mask-repeat-y" */
  String get maskRepeatY =>
    getPropertyValue('${Device.cssPrefix}mask-repeat-y');

  /** Sets the value of "mask-repeat-y" */
  void set maskRepeatY(String value) {
    setProperty('${Device.cssPrefix}mask-repeat-y', value, '');
  }

  /** Gets the value of "mask-size" */
  String get maskSize =>
    getPropertyValue('${Device.cssPrefix}mask-size');

  /** Sets the value of "mask-size" */
  void set maskSize(String value) {
    setProperty('${Device.cssPrefix}mask-size', value, '');
  }

  /** Gets the value of "max-height" */
  String get maxHeight =>
    getPropertyValue('max-height');

  /** Sets the value of "max-height" */
  void set maxHeight(String value) {
    setProperty('max-height', value, '');
  }

  /** Gets the value of "max-logical-height" */
  String get maxLogicalHeight =>
    getPropertyValue('${Device.cssPrefix}max-logical-height');

  /** Sets the value of "max-logical-height" */
  void set maxLogicalHeight(String value) {
    setProperty('${Device.cssPrefix}max-logical-height', value, '');
  }

  /** Gets the value of "max-logical-width" */
  String get maxLogicalWidth =>
    getPropertyValue('${Device.cssPrefix}max-logical-width');

  /** Sets the value of "max-logical-width" */
  void set maxLogicalWidth(String value) {
    setProperty('${Device.cssPrefix}max-logical-width', value, '');
  }

  /** Gets the value of "max-width" */
  String get maxWidth =>
    getPropertyValue('max-width');

  /** Sets the value of "max-width" */
  void 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" */
  void 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" */
  void set minHeight(String value) {
    setProperty('min-height', value, '');
  }

  /** Gets the value of "min-logical-height" */
  String get minLogicalHeight =>
    getPropertyValue('${Device.cssPrefix}min-logical-height');

  /** Sets the value of "min-logical-height" */
  void set minLogicalHeight(String value) {
    setProperty('${Device.cssPrefix}min-logical-height', value, '');
  }

  /** Gets the value of "min-logical-width" */
  String get minLogicalWidth =>
    getPropertyValue('${Device.cssPrefix}min-logical-width');

  /** Sets the value of "min-logical-width" */
  void set minLogicalWidth(String value) {
    setProperty('${Device.cssPrefix}min-logical-width', value, '');
  }

  /** Gets the value of "min-width" */
  String get minWidth =>
    getPropertyValue('min-width');

  /** Sets the value of "min-width" */
  void 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" */
  void set minZoom(String value) {
    setProperty('min-zoom', value, '');
  }

  /** Gets the value of "nbsp-mode" */
  String get nbspMode =>
    getPropertyValue('${Device.cssPrefix}nbsp-mode');

  /** Sets the value of "nbsp-mode" */
  void set nbspMode(String value) {
    setProperty('${Device.cssPrefix}nbsp-mode', value, '');
  }

  /** Gets the value of "opacity" */
  String get opacity =>
    getPropertyValue('opacity');

  /** Sets the value of "opacity" */
  void set opacity(String value) {
    setProperty('opacity', value, '');
  }

  /** Gets the value of "order" */
  String get order =>
    getPropertyValue('${Device.cssPrefix}order');

  /** Sets the value of "order" */
  void set order(String value) {
    setProperty('${Device.cssPrefix}order', value, '');
  }

  /** Gets the value of "orientation" */
  String get orientation =>
    getPropertyValue('orientation');

  /** Sets the value of "orientation" */
  void set orientation(String value) {
    setProperty('orientation', value, '');
  }

  /** Gets the value of "orphans" */
  String get orphans =>
    getPropertyValue('orphans');

  /** Sets the value of "orphans" */
  void set orphans(String value) {
    setProperty('orphans', value, '');
  }

  /** Gets the value of "outline" */
  String get outline =>
    getPropertyValue('outline');

  /** Sets the value of "outline" */
  void 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" */
  void 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" */
  void 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" */
  void 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" */
  void set outlineWidth(String value) {
    setProperty('outline-width', value, '');
  }

  /** Gets the value of "overflow" */
  String get overflow =>
    getPropertyValue('overflow');

  /** Sets the value of "overflow" */
  void set overflow(String value) {
    setProperty('overflow', value, '');
  }

  /** Gets the value of "overflow-scrolling" */
  String get overflowScrolling =>
    getPropertyValue('${Device.cssPrefix}overflow-scrolling');

  /** Sets the value of "overflow-scrolling" */
  void set overflowScrolling(String value) {
    setProperty('${Device.cssPrefix}overflow-scrolling', value, '');
  }

  /** Gets the value of "overflow-wrap" */
  String get overflowWrap =>
    getPropertyValue('overflow-wrap');

  /** Sets the value of "overflow-wrap" */
  void 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" */
  void 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" */
  void set overflowY(String value) {
    setProperty('overflow-y', value, '');
  }

  /** Gets the value of "padding" */
  String get padding =>
    getPropertyValue('padding');

  /** Sets the value of "padding" */
  void set padding(String value) {
    setProperty('padding', value, '');
  }

  /** Gets the value of "padding-after" */
  String get paddingAfter =>
    getPropertyValue('${Device.cssPrefix}padding-after');

  /** Sets the value of "padding-after" */
  void set paddingAfter(String value) {
    setProperty('${Device.cssPrefix}padding-after', value, '');
  }

  /** Gets the value of "padding-before" */
  String get paddingBefore =>
    getPropertyValue('${Device.cssPrefix}padding-before');

  /** Sets the value of "padding-before" */
  void set paddingBefore(String value) {
    setProperty('${Device.cssPrefix}padding-before', value, '');
  }

  /** Gets the value of "padding-bottom" */
  String get paddingBottom =>
    getPropertyValue('padding-bottom');

  /** Sets the value of "padding-bottom" */
  void set paddingBottom(String value) {
    setProperty('padding-bottom', value, '');
  }

  /** Gets the value of "padding-end" */
  String get paddingEnd =>
    getPropertyValue('${Device.cssPrefix}padding-end');

  /** Sets the value of "padding-end" */
  void set paddingEnd(String value) {
    setProperty('${Device.cssPrefix}padding-end', value, '');
  }

  /** Gets the value of "padding-left" */
  String get paddingLeft =>
    getPropertyValue('padding-left');

  /** Sets the value of "padding-left" */
  void 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" */
  void set paddingRight(String value) {
    setProperty('padding-right', value, '');
  }

  /** Gets the value of "padding-start" */
  String get paddingStart =>
    getPropertyValue('${Device.cssPrefix}padding-start');

  /** Sets the value of "padding-start" */
  void set paddingStart(String value) {
    setProperty('${Device.cssPrefix}padding-start', value, '');
  }

  /** Gets the value of "padding-top" */
  String get paddingTop =>
    getPropertyValue('padding-top');

  /** Sets the value of "padding-top" */
  void set paddingTop(String value) {
    setProperty('padding-top', value, '');
  }

  /** Gets the value of "page" */
  String get page =>
    getPropertyValue('page');

  /** Sets the value of "page" */
  void 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" */
  void 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" */
  void 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" */
  void set pageBreakInside(String value) {
    setProperty('page-break-inside', value, '');
  }

  /** Gets the value of "perspective" */
  String get perspective =>
    getPropertyValue('${Device.cssPrefix}perspective');

  /** Sets the value of "perspective" */
  void set perspective(String value) {
    setProperty('${Device.cssPrefix}perspective', value, '');
  }

  /** Gets the value of "perspective-origin" */
  String get perspectiveOrigin =>
    getPropertyValue('${Device.cssPrefix}perspective-origin');

  /** Sets the value of "perspective-origin" */
  void set perspectiveOrigin(String value) {
    setProperty('${Device.cssPrefix}perspective-origin', value, '');
  }

  /** Gets the value of "perspective-origin-x" */
  String get perspectiveOriginX =>
    getPropertyValue('${Device.cssPrefix}perspective-origin-x');

  /** Sets the value of "perspective-origin-x" */
  void set perspectiveOriginX(String value) {
    setProperty('${Device.cssPrefix}perspective-origin-x', value, '');
  }

  /** Gets the value of "perspective-origin-y" */
  String get perspectiveOriginY =>
    getPropertyValue('${Device.cssPrefix}perspective-origin-y');

  /** Sets the value of "perspective-origin-y" */
  void set perspectiveOriginY(String value) {
    setProperty('${Device.cssPrefix}perspective-origin-y', value, '');
  }

  /** Gets the value of "pointer-events" */
  String get pointerEvents =>
    getPropertyValue('pointer-events');

  /** Sets the value of "pointer-events" */
  void set pointerEvents(String value) {
    setProperty('pointer-events', value, '');
  }

  /** Gets the value of "position" */
  String get position =>
    getPropertyValue('position');

  /** Sets the value of "position" */
  void set position(String value) {
    setProperty('position', value, '');
  }

  /** Gets the value of "print-color-adjust" */
  String get printColorAdjust =>
    getPropertyValue('${Device.cssPrefix}print-color-adjust');

  /** Sets the value of "print-color-adjust" */
  void set printColorAdjust(String value) {
    setProperty('${Device.cssPrefix}print-color-adjust', value, '');
  }

  /** Gets the value of "quotes" */
  String get quotes =>
    getPropertyValue('quotes');

  /** Sets the value of "quotes" */
  void set quotes(String value) {
    setProperty('quotes', value, '');
  }

  /** Gets the value of "region-break-after" */
  String get regionBreakAfter =>
    getPropertyValue('${Device.cssPrefix}region-break-after');

  /** Sets the value of "region-break-after" */
  void set regionBreakAfter(String value) {
    setProperty('${Device.cssPrefix}region-break-after', value, '');
  }

  /** Gets the value of "region-break-before" */
  String get regionBreakBefore =>
    getPropertyValue('${Device.cssPrefix}region-break-before');

  /** Sets the value of "region-break-before" */
  void set regionBreakBefore(String value) {
    setProperty('${Device.cssPrefix}region-break-before', value, '');
  }

  /** Gets the value of "region-break-inside" */
  String get regionBreakInside =>
    getPropertyValue('${Device.cssPrefix}region-break-inside');

  /** Sets the value of "region-break-inside" */
  void set regionBreakInside(String value) {
    setProperty('${Device.cssPrefix}region-break-inside', value, '');
  }

  /** Gets the value of "region-overflow" */
  String get regionOverflow =>
    getPropertyValue('${Device.cssPrefix}region-overflow');

  /** Sets the value of "region-overflow" */
  void set regionOverflow(String value) {
    setProperty('${Device.cssPrefix}region-overflow', value, '');
  }

  /** Gets the value of "resize" */
  String get resize =>
    getPropertyValue('resize');

  /** Sets the value of "resize" */
  void set resize(String value) {
    setProperty('resize', value, '');
  }

  /** Gets the value of "right" */
  String get right =>
    getPropertyValue('right');

  /** Sets the value of "right" */
  void set right(String value) {
    setProperty('right', value, '');
  }

  /** Gets the value of "rtl-ordering" */
  String get rtlOrdering =>
    getPropertyValue('${Device.cssPrefix}rtl-ordering');

  /** Sets the value of "rtl-ordering" */
  void set rtlOrdering(String value) {
    setProperty('${Device.cssPrefix}rtl-ordering', value, '');
  }

  /** Gets the value of "shape-inside" */
  String get shapeInside =>
    getPropertyValue('${Device.cssPrefix}shape-inside');

  /** Sets the value of "shape-inside" */
  void set shapeInside(String value) {
    setProperty('${Device.cssPrefix}shape-inside', value, '');
  }

  /** Gets the value of "shape-margin" */
  String get shapeMargin =>
    getPropertyValue('${Device.cssPrefix}shape-margin');

  /** Sets the value of "shape-margin" */
  void set shapeMargin(String value) {
    setProperty('${Device.cssPrefix}shape-margin', value, '');
  }

  /** Gets the value of "shape-outside" */
  String get shapeOutside =>
    getPropertyValue('${Device.cssPrefix}shape-outside');

  /** Sets the value of "shape-outside" */
  void set shapeOutside(String value) {
    setProperty('${Device.cssPrefix}shape-outside', value, '');
  }

  /** Gets the value of "shape-padding" */
  String get shapePadding =>
    getPropertyValue('${Device.cssPrefix}shape-padding');

  /** Sets the value of "shape-padding" */
  void set shapePadding(String value) {
    setProperty('${Device.cssPrefix}shape-padding', value, '');
  }

  /** Gets the value of "size" */
  String get size =>
    getPropertyValue('size');

  /** Sets the value of "size" */
  void set size(String value) {
    setProperty('size', value, '');
  }

  /** Gets the value of "speak" */
  String get speak =>
    getPropertyValue('speak');

  /** Sets the value of "speak" */
  void set speak(String value) {
    setProperty('speak', value, '');
  }

  /** Gets the value of "src" */
  String get src =>
    getPropertyValue('src');

  /** Sets the value of "src" */
  void 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" */
  void 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" */
  void set tableLayout(String value) {
    setProperty('table-layout', value, '');
  }

  /** Gets the value of "tap-highlight-color" */
  String get tapHighlightColor =>
    getPropertyValue('${Device.cssPrefix}tap-highlight-color');

  /** Sets the value of "tap-highlight-color" */
  void set tapHighlightColor(String value) {
    setProperty('${Device.cssPrefix}tap-highlight-color', value, '');
  }

  /** Gets the value of "text-align" */
  String get textAlign =>
    getPropertyValue('text-align');

  /** Sets the value of "text-align" */
  void set textAlign(String value) {
    setProperty('text-align', value, '');
  }

  /** Gets the value of "text-align-last" */
  String get textAlignLast =>
    getPropertyValue('${Device.cssPrefix}text-align-last');

  /** Sets the value of "text-align-last" */
  void set textAlignLast(String value) {
    setProperty('${Device.cssPrefix}text-align-last', value, '');
  }

  /** Gets the value of "text-combine" */
  String get textCombine =>
    getPropertyValue('${Device.cssPrefix}text-combine');

  /** Sets the value of "text-combine" */
  void set textCombine(String value) {
    setProperty('${Device.cssPrefix}text-combine', value, '');
  }

  /** Gets the value of "text-decoration" */
  String get textDecoration =>
    getPropertyValue('text-decoration');

  /** Sets the value of "text-decoration" */
  void set textDecoration(String value) {
    setProperty('text-decoration', value, '');
  }

  /** Gets the value of "text-decoration-line" */
  String get textDecorationLine =>
    getPropertyValue('${Device.cssPrefix}text-decoration-line');

  /** Sets the value of "text-decoration-line" */
  void set textDecorationLine(String value) {
    setProperty('${Device.cssPrefix}text-decoration-line', value, '');
  }

  /** Gets the value of "text-decoration-style" */
  String get textDecorationStyle =>
    getPropertyValue('${Device.cssPrefix}text-decoration-style');

  /** Sets the value of "text-decoration-style" */
  void set textDecorationStyle(String value) {
    setProperty('${Device.cssPrefix}text-decoration-style', value, '');
  }

  /** Gets the value of "text-decorations-in-effect" */
  String get textDecorationsInEffect =>
    getPropertyValue('${Device.cssPrefix}text-decorations-in-effect');

  /** Sets the value of "text-decorations-in-effect" */
  void set textDecorationsInEffect(String value) {
    setProperty('${Device.cssPrefix}text-decorations-in-effect', value, '');
  }

  /** Gets the value of "text-emphasis" */
  String get textEmphasis =>
    getPropertyValue('${Device.cssPrefix}text-emphasis');

  /** Sets the value of "text-emphasis" */
  void set textEmphasis(String value) {
    setProperty('${Device.cssPrefix}text-emphasis', value, '');
  }

  /** Gets the value of "text-emphasis-color" */
  String get textEmphasisColor =>
    getPropertyValue('${Device.cssPrefix}text-emphasis-color');

  /** Sets the value of "text-emphasis-color" */
  void set textEmphasisColor(String value) {
    setProperty('${Device.cssPrefix}text-emphasis-color', value, '');
  }

  /** Gets the value of "text-emphasis-position" */
  String get textEmphasisPosition =>
    getPropertyValue('${Device.cssPrefix}text-emphasis-position');

  /** Sets the value of "text-emphasis-position" */
  void set textEmphasisPosition(String value) {
    setProperty('${Device.cssPrefix}text-emphasis-position', value, '');
  }

  /** Gets the value of "text-emphasis-style" */
  String get textEmphasisStyle =>
    getPropertyValue('${Device.cssPrefix}text-emphasis-style');

  /** Sets the value of "text-emphasis-style" */
  void set textEmphasisStyle(String value) {
    setProperty('${Device.cssPrefix}text-emphasis-style', value, '');
  }

  /** Gets the value of "text-fill-color" */
  String get textFillColor =>
    getPropertyValue('${Device.cssPrefix}text-fill-color');

  /** Sets the value of "text-fill-color" */
  void set textFillColor(String value) {
    setProperty('${Device.cssPrefix}text-fill-color', value, '');
  }

  /** Gets the value of "text-indent" */
  String get textIndent =>
    getPropertyValue('text-indent');

  /** Sets the value of "text-indent" */
  void set textIndent(String value) {
    setProperty('text-indent', value, '');
  }

  /** Gets the value of "text-line-through" */
  String get textLineThrough =>
    getPropertyValue('text-line-through');

  /** Sets the value of "text-line-through" */
  void set textLineThrough(String value) {
    setProperty('text-line-through', 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" */
  void 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" */
  void 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" */
  void 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" */
  void set textLineThroughWidth(String value) {
    setProperty('text-line-through-width', value, '');
  }

  /** Gets the value of "text-orientation" */
  String get textOrientation =>
    getPropertyValue('${Device.cssPrefix}text-orientation');

  /** Sets the value of "text-orientation" */
  void set textOrientation(String value) {
    setProperty('${Device.cssPrefix}text-orientation', value, '');
  }

  /** Gets the value of "text-overflow" */
  String get textOverflow =>
    getPropertyValue('text-overflow');

  /** Sets the value of "text-overflow" */
  void set textOverflow(String value) {
    setProperty('text-overflow', value, '');
  }

  /** Gets the value of "text-overline" */
  String get textOverline =>
    getPropertyValue('text-overline');

  /** Sets the value of "text-overline" */
  void set textOverline(String value) {
    setProperty('text-overline', value, '');
  }

  /** Gets the value of "text-overline-color" */
  String get textOverlineColor =>
    getPropertyValue('text-overline-color');

  /** Sets the value of "text-overline-color" */
  void 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" */
  void 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" */
  void 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" */
  void 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" */
  void set textRendering(String value) {
    setProperty('text-rendering', value, '');
  }

  /** Gets the value of "text-security" */
  String get textSecurity =>
    getPropertyValue('${Device.cssPrefix}text-security');

  /** Sets the value of "text-security" */
  void set textSecurity(String value) {
    setProperty('${Device.cssPrefix}text-security', value, '');
  }

  /** Gets the value of "text-shadow" */
  String get textShadow =>
    getPropertyValue('text-shadow');

  /** Sets the value of "text-shadow" */
  void set textShadow(String value) {
    setProperty('text-shadow', value, '');
  }

  /** Gets the value of "text-size-adjust" */
  String get textSizeAdjust =>
    getPropertyValue('${Device.cssPrefix}text-size-adjust');

  /** Sets the value of "text-size-adjust" */
  void set textSizeAdjust(String value) {
    setProperty('${Device.cssPrefix}text-size-adjust', value, '');
  }

  /** Gets the value of "text-stroke" */
  String get textStroke =>
    getPropertyValue('${Device.cssPrefix}text-stroke');

  /** Sets the value of "text-stroke" */
  void set textStroke(String value) {
    setProperty('${Device.cssPrefix}text-stroke', value, '');
  }

  /** Gets the value of "text-stroke-color" */
  String get textStrokeColor =>
    getPropertyValue('${Device.cssPrefix}text-stroke-color');

  /** Sets the value of "text-stroke-color" */
  void set textStrokeColor(String value) {
    setProperty('${Device.cssPrefix}text-stroke-color', value, '');
  }

  /** Gets the value of "text-stroke-width" */
  String get textStrokeWidth =>
    getPropertyValue('${Device.cssPrefix}text-stroke-width');

  /** Sets the value of "text-stroke-width" */
  void set textStrokeWidth(String value) {
    setProperty('${Device.cssPrefix}text-stroke-width', value, '');
  }

  /** Gets the value of "text-transform" */
  String get textTransform =>
    getPropertyValue('text-transform');

  /** Sets the value of "text-transform" */
  void set textTransform(String value) {
    setProperty('text-transform', value, '');
  }

  /** Gets the value of "text-underline" */
  String get textUnderline =>
    getPropertyValue('text-underline');

  /** Sets the value of "text-underline" */
  void set textUnderline(String value) {
    setProperty('text-underline', value, '');
  }

  /** Gets the value of "text-underline-color" */
  String get textUnderlineColor =>
    getPropertyValue('text-underline-color');

  /** Sets the value of "text-underline-color" */
  void 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" */
  void set textUnderlineMode(String value) {
    setProperty('text-underline-mode', value, '');
  }

  /** Gets the value of "text-underline-style" */
  String get textUnderlineStyle =>
    getPropertyValue('text-underline-style');

  /** Sets the value of "text-underline-style" */
  void 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" */
  void set textUnderlineWidth(String value) {
    setProperty('text-underline-width', value, '');
  }

  /** Gets the value of "top" */
  String get top =>
    getPropertyValue('top');

  /** Sets the value of "top" */
  void set top(String value) {
    setProperty('top', value, '');
  }

  /** Gets the value of "transform" */
  String get transform =>
    getPropertyValue('${Device.cssPrefix}transform');

  /** Sets the value of "transform" */
  void set transform(String value) {
    setProperty('${Device.cssPrefix}transform', value, '');
  }

  /** Gets the value of "transform-origin" */
  String get transformOrigin =>
    getPropertyValue('${Device.cssPrefix}transform-origin');

  /** Sets the value of "transform-origin" */
  void set transformOrigin(String value) {
    setProperty('${Device.cssPrefix}transform-origin', value, '');
  }

  /** Gets the value of "transform-origin-x" */
  String get transformOriginX =>
    getPropertyValue('${Device.cssPrefix}transform-origin-x');

  /** Sets the value of "transform-origin-x" */
  void set transformOriginX(String value) {
    setProperty('${Device.cssPrefix}transform-origin-x', value, '');
  }

  /** Gets the value of "transform-origin-y" */
  String get transformOriginY =>
    getPropertyValue('${Device.cssPrefix}transform-origin-y');

  /** Sets the value of "transform-origin-y" */
  void set transformOriginY(String value) {
    setProperty('${Device.cssPrefix}transform-origin-y', value, '');
  }

  /** Gets the value of "transform-origin-z" */
  String get transformOriginZ =>
    getPropertyValue('${Device.cssPrefix}transform-origin-z');

  /** Sets the value of "transform-origin-z" */
  void set transformOriginZ(String value) {
    setProperty('${Device.cssPrefix}transform-origin-z', value, '');
  }

  /** Gets the value of "transform-style" */
  String get transformStyle =>
    getPropertyValue('${Device.cssPrefix}transform-style');

  /** Sets the value of "transform-style" */
  void set transformStyle(String value) {
    setProperty('${Device.cssPrefix}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('${Device.cssPrefix}transition');

  /** Sets the value of "transition" */
  @SupportedBrowser(SupportedBrowser.CHROME)
  @SupportedBrowser(SupportedBrowser.FIREFOX)
  @SupportedBrowser(SupportedBrowser.IE, '10')
  @SupportedBrowser(SupportedBrowser.SAFARI)
  void set transition(String value) {
    setProperty('${Device.cssPrefix}transition', value, '');
  }

  /** Gets the value of "transition-delay" */
  String get transitionDelay =>
    getPropertyValue('${Device.cssPrefix}transition-delay');

  /** Sets the value of "transition-delay" */
  void set transitionDelay(String value) {
    setProperty('${Device.cssPrefix}transition-delay', value, '');
  }

  /** Gets the value of "transition-duration" */
  String get transitionDuration =>
    getPropertyValue('${Device.cssPrefix}transition-duration');

  /** Sets the value of "transition-duration" */
  void set transitionDuration(String value) {
    setProperty('${Device.cssPrefix}transition-duration', value, '');
  }

  /** Gets the value of "transition-property" */
  String get transitionProperty =>
    getPropertyValue('${Device.cssPrefix}transition-property');

  /** Sets the value of "transition-property" */
  void set transitionProperty(String value) {
    setProperty('${Device.cssPrefix}transition-property', value, '');
  }

  /** Gets the value of "transition-timing-function" */
  String get transitionTimingFunction =>
    getPropertyValue('${Device.cssPrefix}transition-timing-function');

  /** Sets the value of "transition-timing-function" */
  void set transitionTimingFunction(String value) {
    setProperty('${Device.cssPrefix}transition-timing-function', value, '');
  }

  /** Gets the value of "unicode-bidi" */
  String get unicodeBidi =>
    getPropertyValue('unicode-bidi');

  /** Sets the value of "unicode-bidi" */
  void 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" */
  void set unicodeRange(String value) {
    setProperty('unicode-range', value, '');
  }

  /** Gets the value of "user-drag" */
  String get userDrag =>
    getPropertyValue('${Device.cssPrefix}user-drag');

  /** Sets the value of "user-drag" */
  void set userDrag(String value) {
    setProperty('${Device.cssPrefix}user-drag', value, '');
  }

  /** Gets the value of "user-modify" */
  String get userModify =>
    getPropertyValue('${Device.cssPrefix}user-modify');

  /** Sets the value of "user-modify" */
  void set userModify(String value) {
    setProperty('${Device.cssPrefix}user-modify', value, '');
  }

  /** Gets the value of "user-select" */
  String get userSelect =>
    getPropertyValue('${Device.cssPrefix}user-select');

  /** Sets the value of "user-select" */
  void set userSelect(String value) {
    setProperty('${Device.cssPrefix}user-select', value, '');
  }

  /** Gets the value of "user-zoom" */
  String get userZoom =>
    getPropertyValue('user-zoom');

  /** Sets the value of "user-zoom" */
  void 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" */
  void set verticalAlign(String value) {
    setProperty('vertical-align', value, '');
  }

  /** Gets the value of "visibility" */
  String get visibility =>
    getPropertyValue('visibility');

  /** Sets the value of "visibility" */
  void 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" */
  void set whiteSpace(String value) {
    setProperty('white-space', value, '');
  }

  /** Gets the value of "widows" */
  String get widows =>
    getPropertyValue('widows');

  /** Sets the value of "widows" */
  void set widows(String value) {
    setProperty('widows', value, '');
  }

  /** Gets the value of "width" */
  String get width =>
    getPropertyValue('width');

  /** Sets the value of "width" */
  void set width(String value) {
    setProperty('width', value, '');
  }

  /** Gets the value of "word-break" */
  String get wordBreak =>
    getPropertyValue('word-break');

  /** Sets the value of "word-break" */
  void 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" */
  void 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" */
  void set wordWrap(String value) {
    setProperty('word-wrap', value, '');
  }

  /** Gets the value of "wrap" */
  String get wrap =>
    getPropertyValue('${Device.cssPrefix}wrap');

  /** Sets the value of "wrap" */
  void set wrap(String value) {
    setProperty('${Device.cssPrefix}wrap', value, '');
  }

  /** Gets the value of "wrap-flow" */
  String get wrapFlow =>
    getPropertyValue('${Device.cssPrefix}wrap-flow');

  /** Sets the value of "wrap-flow" */
  void set wrapFlow(String value) {
    setProperty('${Device.cssPrefix}wrap-flow', value, '');
  }

  /** Gets the value of "wrap-through" */
  String get wrapThrough =>
    getPropertyValue('${Device.cssPrefix}wrap-through');

  /** Sets the value of "wrap-through" */
  void set wrapThrough(String value) {
    setProperty('${Device.cssPrefix}wrap-through', value, '');
  }

  /** Gets the value of "writing-mode" */
  String get writingMode =>
    getPropertyValue('${Device.cssPrefix}writing-mode');

  /** Sets the value of "writing-mode" */
  void set writingMode(String value) {
    setProperty('${Device.cssPrefix}writing-mode', value, '');
  }

  /** Gets the value of "z-index" */
  String get zIndex =>
    getPropertyValue('z-index');

  /** Sets the value of "z-index" */
  void set zIndex(String value) {
    setProperty('z-index', value, '');
  }

  /** Gets the value of "zoom" */
  String get zoom =>
    getPropertyValue('zoom');

  /** Sets the value of "zoom" */
  void 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.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('CSSStyleRule')
class CssStyleRule extends CssRule {
  CssStyleRule.internal() : super.internal();

  @DomName('CSSStyleRule.selectorText')
  @DocsEditable
  String get selectorText native "CSSStyleRule_selectorText_Getter";

  @DomName('CSSStyleRule.selectorText')
  @DocsEditable
  void set selectorText(String value) native "CSSStyleRule_selectorText_Setter";

  @DomName('CSSStyleRule.style')
  @DocsEditable
  CssStyleDeclaration get style native "CSSStyleRule_style_Getter";

}
// 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.


@DocsEditable
@DomName('CSSStyleSheet')
class CssStyleSheet extends StyleSheet {
  CssStyleSheet.internal() : super.internal();

  @DomName('CSSStyleSheet.cssRules')
  @DocsEditable
  List<CssRule> get cssRules native "CSSStyleSheet_cssRules_Getter";

  @DomName('CSSStyleSheet.ownerRule')
  @DocsEditable
  CssRule get ownerRule native "CSSStyleSheet_ownerRule_Getter";

  @DomName('CSSStyleSheet.rules')
  @DocsEditable
  List<CssRule> get rules native "CSSStyleSheet_rules_Getter";

  int addRule(String selector, String style, [int index]) {
    if (?index) {
      return _addRule_1(selector, style, index);
    }
    return _addRule_2(selector, style);
  }

  @DomName('CSSStyleSheet._addRule_1')
  @DocsEditable
  int _addRule_1(selector, style, index) native "CSSStyleSheet__addRule_1_Callback";

  @DomName('CSSStyleSheet._addRule_2')
  @DocsEditable
  int _addRule_2(selector, style) native "CSSStyleSheet__addRule_2_Callback";

  @DomName('CSSStyleSheet.deleteRule')
  @DocsEditable
  void deleteRule(int index) native "CSSStyleSheet_deleteRule_Callback";

  @DomName('CSSStyleSheet.insertRule')
  @DocsEditable
  int insertRule(String rule, int index) native "CSSStyleSheet_insertRule_Callback";

  @DomName('CSSStyleSheet.removeRule')
  @DocsEditable
  void removeRule(int index) native "CSSStyleSheet_removeRule_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('WebKitCSSTransformValue')
class CssTransformValue extends _CssValueList {
  CssTransformValue.internal() : super.internal();

  static const int CSS_MATRIX = 11;

  static const int CSS_MATRIX3D = 21;

  static const int CSS_PERSPECTIVE = 20;

  static const int CSS_ROTATE = 4;

  static const int CSS_ROTATE3D = 17;

  static const int CSS_ROTATEX = 14;

  static const int CSS_ROTATEY = 15;

  static const int CSS_ROTATEZ = 16;

  static const int CSS_SCALE = 5;

  static const int CSS_SCALE3D = 19;

  static const int CSS_SCALEX = 6;

  static const int CSS_SCALEY = 7;

  static const int CSS_SCALEZ = 18;

  static const int CSS_SKEW = 8;

  static const int CSS_SKEWX = 9;

  static const int CSS_SKEWY = 10;

  static const int CSS_TRANSLATE = 1;

  static const int CSS_TRANSLATE3D = 13;

  static const int CSS_TRANSLATEX = 2;

  static const int CSS_TRANSLATEY = 3;

  static const int CSS_TRANSLATEZ = 12;

  @DomName('WebKitCSSTransformValue.operationType')
  @DocsEditable
  int get operationType native "WebKitCSSTransformValue_operationType_Getter";

}
// 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.


@DocsEditable
@DomName('CSSUnknownRule')
class CssUnknownRule extends CssRule {
  CssUnknownRule.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.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('CSSValue')
class CssValue extends NativeFieldWrapperClass1 {
  CssValue.internal();

  static const int CSS_CUSTOM = 3;

  static const int CSS_INHERIT = 0;

  static const int CSS_PRIMITIVE_VALUE = 1;

  static const int CSS_VALUE_LIST = 2;

  @DomName('CSSValue.cssText')
  @DocsEditable
  String get cssText native "CSSValue_cssText_Getter";

  @DomName('CSSValue.cssText')
  @DocsEditable
  void set cssText(String value) native "CSSValue_cssText_Setter";

  @DomName('CSSValue.cssValueType')
  @DocsEditable
  int get cssValueType native "CSSValue_cssValueType_Getter";

}
// 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('CustomEvent')
class CustomEvent extends Event {
  factory CustomEvent(String type,
      {bool canBubble: true, bool cancelable: true, Object detail}) {

    final CustomEvent e = document.$dom_createEvent("CustomEvent");
    e.$dom_initCustomEvent(type, canBubble, cancelable, detail);

    return e;
  }
  CustomEvent.internal() : super.internal();

  @DomName('CustomEvent.detail')
  @DocsEditable
  Object get detail native "CustomEvent_detail_Getter";

  @DomName('CustomEvent.initCustomEvent')
  @DocsEditable
  void $dom_initCustomEvent(String typeArg, bool canBubbleArg, bool cancelableArg, Object detailArg) native "CustomEvent_initCustomEvent_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('HTMLDListElement')
class DListElement extends _Element_Merged {
  DListElement.internal() : super.internal();

  @DomName('HTMLDListElement.HTMLDListElement')
  @DocsEditable
  factory DListElement() => document.$dom_createElement("dl");

}
// 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.


@DocsEditable
@DomName('HTMLDataListElement')
@SupportedBrowser(SupportedBrowser.CHROME)
@SupportedBrowser(SupportedBrowser.FIREFOX)
@SupportedBrowser(SupportedBrowser.IE, '10')
@SupportedBrowser(SupportedBrowser.SAFARI)
class DataListElement extends _Element_Merged {
  DataListElement.internal() : super.internal();

  @DomName('HTMLDataListElement.HTMLDataListElement')
  @DocsEditable
  factory DataListElement() => document.$dom_createElement("datalist");

  /// Checks if this type is supported on the current platform.
  static bool get supported => true;

  @DomName('HTMLDataListElement.options')
  @DocsEditable
  HtmlCollection get options native "HTMLDataListElement_options_Getter";

}
// 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.


@DocsEditable
@DomName('Clipboard')
class DataTransfer extends NativeFieldWrapperClass1 {
  DataTransfer.internal();

  @DomName('Clipboard.dropEffect')
  @DocsEditable
  String get dropEffect native "Clipboard_dropEffect_Getter";

  @DomName('Clipboard.dropEffect')
  @DocsEditable
  void set dropEffect(String value) native "Clipboard_dropEffect_Setter";

  @DomName('Clipboard.effectAllowed')
  @DocsEditable
  String get effectAllowed native "Clipboard_effectAllowed_Getter";

  @DomName('Clipboard.effectAllowed')
  @DocsEditable
  void set effectAllowed(String value) native "Clipboard_effectAllowed_Setter";

  @DomName('Clipboard.files')
  @DocsEditable
  List<File> get files native "Clipboard_files_Getter";

  @DomName('Clipboard.items')
  @DocsEditable
  DataTransferItemList get items native "Clipboard_items_Getter";

  @DomName('Clipboard.types')
  @DocsEditable
  List get types native "Clipboard_types_Getter";

  @DomName('Clipboard.clearData')
  @DocsEditable
  void clearData([String type]) native "Clipboard_clearData_Callback";

  @DomName('Clipboard.getData')
  @DocsEditable
  String getData(String type) native "Clipboard_getData_Callback";

  @DomName('Clipboard.setData')
  @DocsEditable
  bool setData(String type, String data) native "Clipboard_setData_Callback";

  @DomName('Clipboard.setDragImage')
  @DocsEditable
  void setDragImage(ImageElement image, int x, int y) native "Clipboard_setDragImage_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('DataTransferItem')
class DataTransferItem extends NativeFieldWrapperClass1 {
  DataTransferItem.internal();

  @DomName('DataTransferItem.kind')
  @DocsEditable
  String get kind native "DataTransferItem_kind_Getter";

  @DomName('DataTransferItem.type')
  @DocsEditable
  String get type native "DataTransferItem_type_Getter";

  @DomName('DataTransferItem.getAsFile')
  @DocsEditable
  Blob getAsFile() native "DataTransferItem_getAsFile_Callback";

  @DomName('DataTransferItem.getAsString')
  @DocsEditable
  void _getAsString([_StringCallback callback]) native "DataTransferItem_getAsString_Callback";

  Future<String> getAsString() {
    var completer = new Completer<String>();
    _getAsString(
        (value) { completer.complete(value); });
    return completer.future;
  }

  @DomName('DataTransferItem.webkitGetAsEntry')
  @DocsEditable
  @SupportedBrowser(SupportedBrowser.CHROME)
  @SupportedBrowser(SupportedBrowser.SAFARI)
  @Experimental
  Entry getAsEntry() native "DataTransferItem_webkitGetAsEntry_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('DataTransferItemList')
class DataTransferItemList extends NativeFieldWrapperClass1 {
  DataTransferItemList.internal();

  @DomName('DataTransferItemList.length')
  @DocsEditable
  int get length native "DataTransferItemList_length_Getter";

  void add(data_OR_file, [String type]) {
    if ((data_OR_file is File || data_OR_file == null) && !?type) {
      _add_1(data_OR_file);
      return;
    }
    if ((data_OR_file is String || data_OR_file == null) && (type is String || type == null)) {
      _add_2(data_OR_file, type);
      return;
    }
    throw new ArgumentError("Incorrect number or type of arguments");
  }

  @DomName('DataTransferItemList._add_1')
  @DocsEditable
  void _add_1(data_OR_file) native "DataTransferItemList__add_1_Callback";

  @DomName('DataTransferItemList._add_2')
  @DocsEditable
  void _add_2(data_OR_file, type) native "DataTransferItemList__add_2_Callback";

  @DomName('DataTransferItemList.clear')
  @DocsEditable
  void clear() native "DataTransferItemList_clear_Callback";

  @DomName('DataTransferItemList.item')
  @DocsEditable
  DataTransferItem item(int index) native "DataTransferItemList_item_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('DataView')
class DataView extends ArrayBufferView {
  DataView.internal() : super.internal();
  factory DataView(/*ArrayBuffer*/ buffer, [int byteOffset, int byteLength]) => _create(buffer, byteOffset, byteLength);

  @DocsEditable
  static DataView _create(buffer, byteOffset, byteLength) native "DataView_constructorCallback";

  num getFloat32(int byteOffset, {bool littleEndian}) {
    if (?littleEndian) {
      return _getFloat32_1(byteOffset, littleEndian);
    }
    return _getFloat32_2(byteOffset);
  }

  @DomName('DataView._getFloat32_1')
  @DocsEditable
  num _getFloat32_1(byteOffset, littleEndian) native "DataView__getFloat32_1_Callback";

  @DomName('DataView._getFloat32_2')
  @DocsEditable
  num _getFloat32_2(byteOffset) native "DataView__getFloat32_2_Callback";

  num getFloat64(int byteOffset, {bool littleEndian}) {
    if (?littleEndian) {
      return _getFloat64_1(byteOffset, littleEndian);
    }
    return _getFloat64_2(byteOffset);
  }

  @DomName('DataView._getFloat64_1')
  @DocsEditable
  num _getFloat64_1(byteOffset, littleEndian) native "DataView__getFloat64_1_Callback";

  @DomName('DataView._getFloat64_2')
  @DocsEditable
  num _getFloat64_2(byteOffset) native "DataView__getFloat64_2_Callback";

  int getInt16(int byteOffset, {bool littleEndian}) {
    if (?littleEndian) {
      return _getInt16_1(byteOffset, littleEndian);
    }
    return _getInt16_2(byteOffset);
  }

  @DomName('DataView._getInt16_1')
  @DocsEditable
  int _getInt16_1(byteOffset, littleEndian) native "DataView__getInt16_1_Callback";

  @DomName('DataView._getInt16_2')
  @DocsEditable
  int _getInt16_2(byteOffset) native "DataView__getInt16_2_Callback";

  int getInt32(int byteOffset, {bool littleEndian}) {
    if (?littleEndian) {
      return _getInt32_1(byteOffset, littleEndian);
    }
    return _getInt32_2(byteOffset);
  }

  @DomName('DataView._getInt32_1')
  @DocsEditable
  int _getInt32_1(byteOffset, littleEndian) native "DataView__getInt32_1_Callback";

  @DomName('DataView._getInt32_2')
  @DocsEditable
  int _getInt32_2(byteOffset) native "DataView__getInt32_2_Callback";

  @DomName('DataView.getInt8')
  @DocsEditable
  int getInt8(int byteOffset) native "DataView_getInt8_Callback";

  int getUint16(int byteOffset, {bool littleEndian}) {
    if (?littleEndian) {
      return _getUint16_1(byteOffset, littleEndian);
    }
    return _getUint16_2(byteOffset);
  }

  @DomName('DataView._getUint16_1')
  @DocsEditable
  int _getUint16_1(byteOffset, littleEndian) native "DataView__getUint16_1_Callback";

  @DomName('DataView._getUint16_2')
  @DocsEditable
  int _getUint16_2(byteOffset) native "DataView__getUint16_2_Callback";

  int getUint32(int byteOffset, {bool littleEndian}) {
    if (?littleEndian) {
      return _getUint32_1(byteOffset, littleEndian);
    }
    return _getUint32_2(byteOffset);
  }

  @DomName('DataView._getUint32_1')
  @DocsEditable
  int _getUint32_1(byteOffset, littleEndian) native "DataView__getUint32_1_Callback";

  @DomName('DataView._getUint32_2')
  @DocsEditable
  int _getUint32_2(byteOffset) native "DataView__getUint32_2_Callback";

  @DomName('DataView.getUint8')
  @DocsEditable
  int getUint8(int byteOffset) native "DataView_getUint8_Callback";

  void setFloat32(int byteOffset, num value, {bool littleEndian}) {
    if (?littleEndian) {
      _setFloat32_1(byteOffset, value, littleEndian);
      return;
    }
    _setFloat32_2(byteOffset, value);
    return;
  }

  @DomName('DataView._setFloat32_1')
  @DocsEditable
  void _setFloat32_1(byteOffset, value, littleEndian) native "DataView__setFloat32_1_Callback";

  @DomName('DataView._setFloat32_2')
  @DocsEditable
  void _setFloat32_2(byteOffset, value) native "DataView__setFloat32_2_Callback";

  void setFloat64(int byteOffset, num value, {bool littleEndian}) {
    if (?littleEndian) {
      _setFloat64_1(byteOffset, value, littleEndian);
      return;
    }
    _setFloat64_2(byteOffset, value);
    return;
  }

  @DomName('DataView._setFloat64_1')
  @DocsEditable
  void _setFloat64_1(byteOffset, value, littleEndian) native "DataView__setFloat64_1_Callback";

  @DomName('DataView._setFloat64_2')
  @DocsEditable
  void _setFloat64_2(byteOffset, value) native "DataView__setFloat64_2_Callback";

  void setInt16(int byteOffset, int value, {bool littleEndian}) {
    if (?littleEndian) {
      _setInt16_1(byteOffset, value, littleEndian);
      return;
    }
    _setInt16_2(byteOffset, value);
    return;
  }

  @DomName('DataView._setInt16_1')
  @DocsEditable
  void _setInt16_1(byteOffset, value, littleEndian) native "DataView__setInt16_1_Callback";

  @DomName('DataView._setInt16_2')
  @DocsEditable
  void _setInt16_2(byteOffset, value) native "DataView__setInt16_2_Callback";

  void setInt32(int byteOffset, int value, {bool littleEndian}) {
    if (?littleEndian) {
      _setInt32_1(byteOffset, value, littleEndian);
      return;
    }
    _setInt32_2(byteOffset, value);
    return;
  }

  @DomName('DataView._setInt32_1')
  @DocsEditable
  void _setInt32_1(byteOffset, value, littleEndian) native "DataView__setInt32_1_Callback";

  @DomName('DataView._setInt32_2')
  @DocsEditable
  void _setInt32_2(byteOffset, value) native "DataView__setInt32_2_Callback";

  @DomName('DataView.setInt8')
  @DocsEditable
  void setInt8(int byteOffset, int value) native "DataView_setInt8_Callback";

  void setUint16(int byteOffset, int value, {bool littleEndian}) {
    if (?littleEndian) {
      _setUint16_1(byteOffset, value, littleEndian);
      return;
    }
    _setUint16_2(byteOffset, value);
    return;
  }

  @DomName('DataView._setUint16_1')
  @DocsEditable
  void _setUint16_1(byteOffset, value, littleEndian) native "DataView__setUint16_1_Callback";

  @DomName('DataView._setUint16_2')
  @DocsEditable
  void _setUint16_2(byteOffset, value) native "DataView__setUint16_2_Callback";

  void setUint32(int byteOffset, int value, {bool littleEndian}) {
    if (?littleEndian) {
      _setUint32_1(byteOffset, value, littleEndian);
      return;
    }
    _setUint32_2(byteOffset, value);
    return;
  }

  @DomName('DataView._setUint32_1')
  @DocsEditable
  void _setUint32_1(byteOffset, value, littleEndian) native "DataView__setUint32_1_Callback";

  @DomName('DataView._setUint32_2')
  @DocsEditable
  void _setUint32_2(byteOffset, value) native "DataView__setUint32_2_Callback";

  @DomName('DataView.setUint8')
  @DocsEditable
  void setUint8(int byteOffset, int value) native "DataView_setUint8_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('DedicatedWorkerContext')
class DedicatedWorkerContext extends WorkerContext {
  DedicatedWorkerContext.internal() : super.internal();

  @DomName('DedicatedWorkerContext.messageEvent')
  @DocsEditable
  static const EventStreamProvider<MessageEvent> messageEvent = const EventStreamProvider<MessageEvent>('message');

  @DomName('DedicatedWorkerContext.postMessage')
  @DocsEditable
  void postMessage(Object message, [List messagePorts]) native "DedicatedWorkerContext_postMessage_Callback";

  @DomName('DedicatedWorkerContext.onmessage')
  @DocsEditable
  Stream<MessageEvent> get onMessage => messageEvent.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.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('HTMLDetailsElement')
@SupportedBrowser(SupportedBrowser.CHROME)
@SupportedBrowser(SupportedBrowser.SAFARI)
@Experimental
class DetailsElement extends _Element_Merged {
  DetailsElement.internal() : super.internal();

  @DomName('HTMLDetailsElement.HTMLDetailsElement')
  @DocsEditable
  factory DetailsElement() => document.$dom_createElement("details");

  /// Checks if this type is supported on the current platform.
  static bool get supported => true;

  @DomName('HTMLDetailsElement.open')
  @DocsEditable
  bool get open native "HTMLDetailsElement_open_Getter";

  @DomName('HTMLDetailsElement.open')
  @DocsEditable
  void set open(bool value) native "HTMLDetailsElement_open_Setter";

}
// 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.


@DocsEditable
@DomName('DeviceMotionEvent')
class DeviceMotionEvent extends Event {
  DeviceMotionEvent.internal() : super.internal();

  @DomName('DeviceMotionEvent.interval')
  @DocsEditable
  num get interval native "DeviceMotionEvent_interval_Getter";

}
// 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.

@DomName('DeviceOrientationEvent')

class DeviceOrientationEvent extends Event {
  factory DeviceOrientationEvent(String type,
      {bool canBubble: true, bool cancelable: true, num alpha: 0, num beta: 0,
      num gamma: 0, bool absolute: false}) {
    var e = document.$dom_createEvent("DeviceOrientationEvent");
    e.$dom_initDeviceOrientationEvent(type, canBubble, cancelable, alpha, beta,
        gamma, absolute);
    return e;
  }
  DeviceOrientationEvent.internal() : super.internal();

  @DomName('DeviceOrientationEvent.absolute')
  @DocsEditable
  bool get absolute native "DeviceOrientationEvent_absolute_Getter";

  @DomName('DeviceOrientationEvent.alpha')
  @DocsEditable
  num get alpha native "DeviceOrientationEvent_alpha_Getter";

  @DomName('DeviceOrientationEvent.beta')
  @DocsEditable
  num get beta native "DeviceOrientationEvent_beta_Getter";

  @DomName('DeviceOrientationEvent.gamma')
  @DocsEditable
  num get gamma native "DeviceOrientationEvent_gamma_Getter";

  @DomName('DeviceOrientationEvent.initDeviceOrientationEvent')
  @DocsEditable
  void $dom_initDeviceOrientationEvent(String type, bool bubbles, bool cancelable, num alpha, num beta, num gamma, bool absolute) native "DeviceOrientationEvent_initDeviceOrientationEvent_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('DirectoryEntry')
class DirectoryEntry extends Entry {
  DirectoryEntry.internal() : super.internal();

  @DomName('DirectoryEntry.createReader')
  @DocsEditable
  DirectoryReader createReader() native "DirectoryEntry_createReader_Callback";

  @DomName('DirectoryEntry.getDirectory')
  @DocsEditable
  void _getDirectory(String path, {Map options, _EntryCallback successCallback, _ErrorCallback errorCallback}) native "DirectoryEntry_getDirectory_Callback";

  Future<Entry> getDirectory(String path, {Map options}) {
    var completer = new Completer<Entry>();
    _getDirectory(path, options : options,
        successCallback : (value) { completer.complete(value); },
        errorCallback : (error) { completer.completeError(error); });
    return completer.future;
  }

  @DomName('DirectoryEntry.getFile')
  @DocsEditable
  void _getFile(String path, {Map options, _EntryCallback successCallback, _ErrorCallback errorCallback}) native "DirectoryEntry_getFile_Callback";

  Future<Entry> getFile(String path, {Map options}) {
    var completer = new Completer<Entry>();
    _getFile(path, options : options,
        successCallback : (value) { completer.complete(value); },
        errorCallback : (error) { completer.completeError(error); });
    return completer.future;
  }

  @DomName('DirectoryEntry.removeRecursively')
  @DocsEditable
  void _removeRecursively(VoidCallback successCallback, [_ErrorCallback errorCallback]) native "DirectoryEntry_removeRecursively_Callback";

  Future removeRecursively() {
    var completer = new Completer();
    _removeRecursively(
        () { completer.complete(); },
        (error) { completer.completeError(error); });
    return completer.future;
  }

}
// 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.


@DocsEditable
@DomName('DirectoryEntrySync')
class DirectoryEntrySync extends EntrySync {
  DirectoryEntrySync.internal() : super.internal();

  @DomName('DirectoryEntrySync.createReader')
  @DocsEditable
  DirectoryReaderSync createReader() native "DirectoryEntrySync_createReader_Callback";

  @DomName('DirectoryEntrySync.getDirectory')
  @DocsEditable
  DirectoryEntrySync getDirectory(String path, Map flags) native "DirectoryEntrySync_getDirectory_Callback";

  @DomName('DirectoryEntrySync.getFile')
  @DocsEditable
  FileEntrySync getFile(String path, Map flags) native "DirectoryEntrySync_getFile_Callback";

  @DomName('DirectoryEntrySync.removeRecursively')
  @DocsEditable
  void removeRecursively() native "DirectoryEntrySync_removeRecursively_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('DirectoryReader')
class DirectoryReader extends NativeFieldWrapperClass1 {
  DirectoryReader.internal();

  @DomName('DirectoryReader.readEntries')
  @DocsEditable
  void _readEntries(_EntriesCallback successCallback, [_ErrorCallback errorCallback]) native "DirectoryReader_readEntries_Callback";

  Future<List<Entry>> readEntries() {
    var completer = new Completer<List<Entry>>();
    _readEntries(
        (value) { completer.complete(value); },
        (error) { completer.completeError(error); });
    return completer.future;
  }

}
// 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.


@DocsEditable
@DomName('DirectoryReaderSync')
class DirectoryReaderSync extends NativeFieldWrapperClass1 {
  DirectoryReaderSync.internal();

  @DomName('DirectoryReaderSync.readEntries')
  @DocsEditable
  List<EntrySync> readEntries() native "DirectoryReaderSync_readEntries_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
/**
 * Represents an HTML <div> element.
 *
 * The [DivElement] is a generic container for content and does not have any
 * special 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')
class DivElement extends _Element_Merged {
  DivElement.internal() : super.internal();

  @DomName('HTMLDivElement.HTMLDivElement')
  @DocsEditable
  factory DivElement() => document.$dom_createElement("div");

}
// 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.


/**
 * 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')
class Document extends Node 
{

  Document.internal() : super.internal();

  @DomName('Document.readystatechangeEvent')
  @DocsEditable
  static const EventStreamProvider<Event> readyStateChangeEvent = const EventStreamProvider<Event>('readystatechange');

  @DomName('Document.selectionchangeEvent')
  @DocsEditable
  static const EventStreamProvider<Event> selectionChangeEvent = const EventStreamProvider<Event>('selectionchange');

  @DomName('Document.webkitpointerlockchangeEvent')
  @DocsEditable
  @SupportedBrowser(SupportedBrowser.CHROME)
  @SupportedBrowser(SupportedBrowser.SAFARI)
  @Experimental
  static const EventStreamProvider<Event> pointerLockChangeEvent = const EventStreamProvider<Event>('webkitpointerlockchange');

  @DomName('Document.webkitpointerlockerrorEvent')
  @DocsEditable
  @SupportedBrowser(SupportedBrowser.CHROME)
  @SupportedBrowser(SupportedBrowser.SAFARI)
  @Experimental
  static const EventStreamProvider<Event> pointerLockErrorEvent = const EventStreamProvider<Event>('webkitpointerlockerror');

  /// Moved to [HtmlDocument].
  @DomName('Document.body')
  @DocsEditable
  Element get $dom_body native "Document_body_Getter";

  /// Moved to [HtmlDocument].
  @DomName('Document.body')
  @DocsEditable
  void set $dom_body(Element value) native "Document_body_Setter";

  @DomName('Document.charset')
  @DocsEditable
  String get charset native "Document_charset_Getter";

  @DomName('Document.charset')
  @DocsEditable
  void set charset(String value) native "Document_charset_Setter";

  @DomName('Document.cookie')
  @DocsEditable
  String get cookie native "Document_cookie_Getter";

  @DomName('Document.cookie')
  @DocsEditable
  void set cookie(String value) native "Document_cookie_Setter";

  @DomName('Document.defaultView')
  @DocsEditable
  WindowBase get window native "Document_defaultView_Getter";

  @DomName('Document.documentElement')
  @DocsEditable
  Element get documentElement native "Document_documentElement_Getter";

  @DomName('Document.domain')
  @DocsEditable
  String get domain native "Document_domain_Getter";

  /// Moved to [HtmlDocument].
  @DomName('Document.head')
  @DocsEditable
  HeadElement get $dom_head native "Document_head_Getter";

  @DomName('Document.implementation')
  @DocsEditable
  DomImplementation get implementation native "Document_implementation_Getter";

  /// Moved to [HtmlDocument].
  @DomName('Document.lastModified')
  @DocsEditable
  String get $dom_lastModified native "Document_lastModified_Getter";

  @DomName('Document.preferredStylesheetSet')
  @DocsEditable
  String get $dom_preferredStylesheetSet native "Document_preferredStylesheetSet_Getter";

  @DomName('Document.readyState')
  @DocsEditable
  String get readyState native "Document_readyState_Getter";

  /// Moved to [HtmlDocument].
  @DomName('Document.referrer')
  @DocsEditable
  String get $dom_referrer native "Document_referrer_Getter";

  @DomName('Document.selectedStylesheetSet')
  @DocsEditable
  String get $dom_selectedStylesheetSet native "Document_selectedStylesheetSet_Getter";

  @DomName('Document.selectedStylesheetSet')
  @DocsEditable
  void set $dom_selectedStylesheetSet(String value) native "Document_selectedStylesheetSet_Setter";

  /// Moved to [HtmlDocument]
  @DomName('Document.styleSheets')
  @DocsEditable
  List<StyleSheet> get $dom_styleSheets native "Document_styleSheets_Getter";

  /// Moved to [HtmlDocument].
  @DomName('Document.title')
  @DocsEditable
  String get $dom_title native "Document_title_Getter";

  /// Moved to [HtmlDocument].
  @DomName('Document.title')
  @DocsEditable
  void set $dom_title(String value) native "Document_title_Setter";

  /// Moved to [HtmlDocument].
  @DomName('Document.webkitFullscreenElement')
  @DocsEditable
  @SupportedBrowser(SupportedBrowser.CHROME)
  @SupportedBrowser(SupportedBrowser.SAFARI)
  @Experimental
  Element get $dom_webkitFullscreenElement native "Document_webkitFullscreenElement_Getter";

  /// Moved to [HtmlDocument].
  @DomName('Document.webkitFullscreenEnabled')
  @DocsEditable
  @SupportedBrowser(SupportedBrowser.CHROME)
  @SupportedBrowser(SupportedBrowser.SAFARI)
  @Experimental
  bool get $dom_webkitFullscreenEnabled native "Document_webkitFullscreenEnabled_Getter";

  /// Moved to [HtmlDocument].
  @DomName('Document.webkitHidden')
  @DocsEditable
  @SupportedBrowser(SupportedBrowser.CHROME)
  @SupportedBrowser(SupportedBrowser.SAFARI)
  @Experimental
  bool get $dom_webkitHidden native "Document_webkitHidden_Getter";

  /// Moved to [HtmlDocument].
  @DomName('Document.webkitIsFullScreen')
  @DocsEditable
  @SupportedBrowser(SupportedBrowser.CHROME)
  @SupportedBrowser(SupportedBrowser.SAFARI)
  @Experimental
  bool get $dom_webkitIsFullScreen native "Document_webkitIsFullScreen_Getter";

  /// Moved to [HtmlDocument].
  @DomName('Document.webkitPointerLockElement')
  @DocsEditable
  @SupportedBrowser(SupportedBrowser.CHROME)
  @SupportedBrowser(SupportedBrowser.SAFARI)
  @Experimental
  Element get $dom_webkitPointerLockElement native "Document_webkitPointerLockElement_Getter";

  @DomName('Document.webkitVisibilityState')
  @DocsEditable
  @SupportedBrowser(SupportedBrowser.CHROME)
  @SupportedBrowser(SupportedBrowser.SAFARI)
  @Experimental
  String get $dom_webkitVisibilityState native "Document_webkitVisibilityState_Getter";

  /// Use the [Range] constructor instead.
  @DomName('Document.caretRangeFromPoint')
  @DocsEditable
  Range $dom_caretRangeFromPoint(int x, int y) native "Document_caretRangeFromPoint_Callback";

  @DomName('Document.createCDATASection')
  @DocsEditable
  CDataSection createCDataSection(String data) native "Document_createCDATASection_Callback";

  @DomName('Document.createDocumentFragment')
  @DocsEditable
  DocumentFragment createDocumentFragment() native "Document_createDocumentFragment_Callback";

  /// Deprecated: use new Element.tag(tagName) instead.
  @DomName('Document.createElement')
  @DocsEditable
  Element $dom_createElement(String tagName) native "Document_createElement_Callback";

  @DomName('Document.createElementNS')
  @DocsEditable
  Element $dom_createElementNS(String namespaceURI, String qualifiedName) native "Document_createElementNS_Callback";

  @DomName('Document.createEvent')
  @DocsEditable
  Event $dom_createEvent(String eventType) native "Document_createEvent_Callback";

  @DomName('Document.createRange')
  @DocsEditable
  Range $dom_createRange() native "Document_createRange_Callback";

  @DomName('Document.createTextNode')
  @DocsEditable
  Text $dom_createTextNode(String data) native "Document_createTextNode_Callback";

  @DomName('Document.createTouch')
  @DocsEditable
  Touch $dom_createTouch(Window window, EventTarget target, int identifier, int pageX, int pageY, int screenX, int screenY, int webkitRadiusX, int webkitRadiusY, num webkitRotationAngle, num webkitForce) native "Document_createTouch_Callback";

  /// Use the [TouchList] constructor instead.
  @DomName('Document.createTouchList')
  @DocsEditable
  TouchList $dom_createTouchList() native "Document_createTouchList_Callback";

  @DomName('Document.elementFromPoint')
  @DocsEditable
  Element $dom_elementFromPoint(int x, int y) native "Document_elementFromPoint_Callback";

  @DomName('Document.execCommand')
  @DocsEditable
  bool execCommand(String command, bool userInterface, String value) native "Document_execCommand_Callback";

  /// Moved to [HtmlDocument].
  @DomName('Document.getCSSCanvasContext')
  @DocsEditable
  CanvasRenderingContext $dom_getCssCanvasContext(String contextId, String name, int width, int height) native "Document_getCSSCanvasContext_Callback";

  @DomName('Document.getElementById')
  @DocsEditable
  Element getElementById(String elementId) native "Document_getElementById_Callback";

  @DomName('Document.getElementsByClassName')
  @DocsEditable
  List<Node> getElementsByClassName(String tagname) native "Document_getElementsByClassName_Callback";

  @DomName('Document.getElementsByName')
  @DocsEditable
  List<Node> getElementsByName(String elementName) native "Document_getElementsByName_Callback";

  @DomName('Document.getElementsByTagName')
  @DocsEditable
  List<Node> getElementsByTagName(String tagname) native "Document_getElementsByTagName_Callback";

  @DomName('Document.queryCommandEnabled')
  @DocsEditable
  bool queryCommandEnabled(String command) native "Document_queryCommandEnabled_Callback";

  @DomName('Document.queryCommandIndeterm')
  @DocsEditable
  bool queryCommandIndeterm(String command) native "Document_queryCommandIndeterm_Callback";

  @DomName('Document.queryCommandState')
  @DocsEditable
  bool queryCommandState(String command) native "Document_queryCommandState_Callback";

  @DomName('Document.queryCommandSupported')
  @DocsEditable
  bool queryCommandSupported(String command) native "Document_queryCommandSupported_Callback";

  @DomName('Document.queryCommandValue')
  @DocsEditable
  String queryCommandValue(String command) native "Document_queryCommandValue_Callback";

  /**
 * Finds the first descendant element of this document that matches the
 * specified group of selectors.
 *
 * Unless your webpage contains multiple documents, the top-level query
 * 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.query('.className');
 *     var element2 = document.query('#id');
 *
 * For details about CSS selector syntax, see the
 * [CSS selector specification](http://www.w3.org/TR/css3-selectors/).
 */
  @DomName('Document.querySelector')
  @DocsEditable
  Element query(String selectors) native "Document_querySelector_Callback";

  /// Deprecated: use query("#$elementId") instead.
  @DomName('Document.querySelectorAll')
  @DocsEditable
  List<Node> $dom_querySelectorAll(String selectors) native "Document_querySelectorAll_Callback";

  /// Moved to [HtmlDocument].
  @DomName('Document.webkitCancelFullScreen')
  @DocsEditable
  @SupportedBrowser(SupportedBrowser.CHROME)
  @SupportedBrowser(SupportedBrowser.SAFARI)
  @Experimental
  void $dom_webkitCancelFullScreen() native "Document_webkitCancelFullScreen_Callback";

  /// Moved to [HtmlDocument].
  @DomName('Document.webkitExitFullscreen')
  @DocsEditable
  @SupportedBrowser(SupportedBrowser.CHROME)
  @SupportedBrowser(SupportedBrowser.SAFARI)
  @Experimental
  void $dom_webkitExitFullscreen() native "Document_webkitExitFullscreen_Callback";

  /// Moved to [HtmlDocument].
  @DomName('Document.webkitExitPointerLock')
  @DocsEditable
  @SupportedBrowser(SupportedBrowser.CHROME)
  @SupportedBrowser(SupportedBrowser.SAFARI)
  @Experimental
  void $dom_webkitExitPointerLock() native "Document_webkitExitPointerLock_Callback";

  @DomName('Document.onabort')
  @DocsEditable
  Stream<Event> get onAbort => Element.abortEvent.forTarget(this);

  @DomName('Document.onbeforecopy')
  @DocsEditable
  Stream<Event> get onBeforeCopy => Element.beforeCopyEvent.forTarget(this);

  @DomName('Document.onbeforecut')
  @DocsEditable
  Stream<Event> get onBeforeCut => Element.beforeCutEvent.forTarget(this);

  @DomName('Document.onbeforepaste')
  @DocsEditable
  Stream<Event> get onBeforePaste => Element.beforePasteEvent.forTarget(this);

  @DomName('Document.onblur')
  @DocsEditable
  Stream<Event> get onBlur => Element.blurEvent.forTarget(this);

  @DomName('Document.onchange')
  @DocsEditable
  Stream<Event> get onChange => Element.changeEvent.forTarget(this);

  @DomName('Document.onclick')
  @DocsEditable
  Stream<MouseEvent> get onClick => Element.clickEvent.forTarget(this);

  @DomName('Document.oncontextmenu')
  @DocsEditable
  Stream<MouseEvent> get onContextMenu => Element.contextMenuEvent.forTarget(this);

  @DomName('Document.oncopy')
  @DocsEditable
  Stream<Event> get onCopy => Element.copyEvent.forTarget(this);

  @DomName('Document.oncut')
  @DocsEditable
  Stream<Event> get onCut => Element.cutEvent.forTarget(this);

  @DomName('Document.ondblclick')
  @DocsEditable
  Stream<Event> get onDoubleClick => Element.doubleClickEvent.forTarget(this);

  @DomName('Document.ondrag')
  @DocsEditable
  Stream<MouseEvent> get onDrag => Element.dragEvent.forTarget(this);

  @DomName('Document.ondragend')
  @DocsEditable
  Stream<MouseEvent> get onDragEnd => Element.dragEndEvent.forTarget(this);

  @DomName('Document.ondragenter')
  @DocsEditable
  Stream<MouseEvent> get onDragEnter => Element.dragEnterEvent.forTarget(this);

  @DomName('Document.ondragleave')
  @DocsEditable
  Stream<MouseEvent> get onDragLeave => Element.dragLeaveEvent.forTarget(this);

  @DomName('Document.ondragover')
  @DocsEditable
  Stream<MouseEvent> get onDragOver => Element.dragOverEvent.forTarget(this);

  @DomName('Document.ondragstart')
  @DocsEditable
  Stream<MouseEvent> get onDragStart => Element.dragStartEvent.forTarget(this);

  @DomName('Document.ondrop')
  @DocsEditable
  Stream<MouseEvent> get onDrop => Element.dropEvent.forTarget(this);

  @DomName('Document.onerror')
  @DocsEditable
  Stream<Event> get onError => Element.errorEvent.forTarget(this);

  @DomName('Document.onfocus')
  @DocsEditable
  Stream<Event> get onFocus => Element.focusEvent.forTarget(this);

  @DomName('Document.oninput')
  @DocsEditable
  Stream<Event> get onInput => Element.inputEvent.forTarget(this);

  @DomName('Document.oninvalid')
  @DocsEditable
  Stream<Event> get onInvalid => Element.invalidEvent.forTarget(this);

  @DomName('Document.onkeydown')
  @DocsEditable
  Stream<KeyboardEvent> get onKeyDown => Element.keyDownEvent.forTarget(this);

  @DomName('Document.onkeypress')
  @DocsEditable
  Stream<KeyboardEvent> get onKeyPress => Element.keyPressEvent.forTarget(this);

  @DomName('Document.onkeyup')
  @DocsEditable
  Stream<KeyboardEvent> get onKeyUp => Element.keyUpEvent.forTarget(this);

  @DomName('Document.onload')
  @DocsEditable
  Stream<Event> get onLoad => Element.loadEvent.forTarget(this);

  @DomName('Document.onmousedown')
  @DocsEditable
  Stream<MouseEvent> get onMouseDown => Element.mouseDownEvent.forTarget(this);

  @DomName('Document.onmousemove')
  @DocsEditable
  Stream<MouseEvent> get onMouseMove => Element.mouseMoveEvent.forTarget(this);

  @DomName('Document.onmouseout')
  @DocsEditable
  Stream<MouseEvent> get onMouseOut => Element.mouseOutEvent.forTarget(this);

  @DomName('Document.onmouseover')
  @DocsEditable
  Stream<MouseEvent> get onMouseOver => Element.mouseOverEvent.forTarget(this);

  @DomName('Document.onmouseup')
  @DocsEditable
  Stream<MouseEvent> get onMouseUp => Element.mouseUpEvent.forTarget(this);

  @DomName('Document.onmousewheel')
  @DocsEditable
  Stream<WheelEvent> get onMouseWheel => Element.mouseWheelEvent.forTarget(this);

  @DomName('Document.onpaste')
  @DocsEditable
  Stream<Event> get onPaste => Element.pasteEvent.forTarget(this);

  @DomName('Document.onreadystatechange')
  @DocsEditable
  Stream<Event> get onReadyStateChange => readyStateChangeEvent.forTarget(this);

  @DomName('Document.onreset')
  @DocsEditable
  Stream<Event> get onReset => Element.resetEvent.forTarget(this);

  @DomName('Document.onscroll')
  @DocsEditable
  Stream<Event> get onScroll => Element.scrollEvent.forTarget(this);

  @DomName('Document.onsearch')
  @DocsEditable
  Stream<Event> get onSearch => Element.searchEvent.forTarget(this);

  @DomName('Document.onselect')
  @DocsEditable
  Stream<Event> get onSelect => Element.selectEvent.forTarget(this);

  @DomName('Document.onselectionchange')
  @DocsEditable
  Stream<Event> get onSelectionChange => selectionChangeEvent.forTarget(this);

  @DomName('Document.onselectstart')
  @DocsEditable
  Stream<Event> get onSelectStart => Element.selectStartEvent.forTarget(this);

  @DomName('Document.onsubmit')
  @DocsEditable
  Stream<Event> get onSubmit => Element.submitEvent.forTarget(this);

  @DomName('Document.ontouchcancel')
  @DocsEditable
  Stream<TouchEvent> get onTouchCancel => Element.touchCancelEvent.forTarget(this);

  @DomName('Document.ontouchend')
  @DocsEditable
  Stream<TouchEvent> get onTouchEnd => Element.touchEndEvent.forTarget(this);

  @DomName('Document.ontouchmove')
  @DocsEditable
  Stream<TouchEvent> get onTouchMove => Element.touchMoveEvent.forTarget(this);

  @DomName('Document.ontouchstart')
  @DocsEditable
  Stream<TouchEvent> get onTouchStart => Element.touchStartEvent.forTarget(this);

  @DomName('Document.onwebkitfullscreenchange')
  @DocsEditable
  Stream<Event> get onFullscreenChange => Element.fullscreenChangeEvent.forTarget(this);

  @DomName('Document.onwebkitfullscreenerror')
  @DocsEditable
  Stream<Event> get onFullscreenError => Element.fullscreenErrorEvent.forTarget(this);

  @DomName('Document.onwebkitpointerlockchange')
  @DocsEditable
  Stream<Event> get onPointerLockChange => pointerLockChangeEvent.forTarget(this);

  @DomName('Document.onwebkitpointerlockerror')
  @DocsEditable
  Stream<Event> get onPointerLockError => pointerLockErrorEvent.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 queryAll
   * 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.queryAll('.itemClassName');
   *
   * For details about CSS selector syntax, see the
   * [CSS selector specification](http://www.w3.org/TR/css3-selectors/).
   */
  List<Element> queryAll(String selectors) {
    return new _FrozenElementList._wrap($dom_querySelectorAll(selectors));
  }
}
// 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')
class DocumentFragment extends Node {
  factory DocumentFragment() => _DocumentFragmentFactoryProvider.createDocumentFragment();

  factory DocumentFragment.html(String html) =>
      _DocumentFragmentFactoryProvider.createDocumentFragment_html(html);

  factory DocumentFragment.svg(String svgContent) =>
      _DocumentFragmentFactoryProvider.createDocumentFragment_svg(svgContent);

  List<Element> _children;

  List<Element> get children {
    if (_children == null) {
      _children = new FilteredElementList(this);
    }
    return _children;
  }

  void 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);
  }

  Element query(String selectors) => $dom_querySelector(selectors);

  List<Element> queryAll(String selectors) =>
    new _FrozenElementList._wrap($dom_querySelectorAll(selectors));

  String get innerHtml {
    final e = new Element.tag("div");
    e.append(this.clone(true));
    return e.innerHtml;
  }

  // TODO(nweiz): Do we want to support some variant of innerHtml for XML and/or
  // SVG strings?
  void set innerHtml(String value) {
    this.nodes.clear();

    final e = new Element.tag("div");
    e.innerHtml = value;

    // Copy list first since we don't want liveness during iteration.
    List nodes = new List.from(e.nodes);
    this.nodes.addAll(nodes);
  }

  /**
   * 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) {
    this.append(new DocumentFragment.html(text));
  }

  DocumentFragment.internal() : super.internal();

  @DomName('DocumentFragment.querySelector')
  @DocsEditable
  Element $dom_querySelector(String selectors) native "DocumentFragment_querySelector_Callback";

  @DomName('DocumentFragment.querySelectorAll')
  @DocsEditable
  List<Node> $dom_querySelectorAll(String selectors) native "DocumentFragment_querySelectorAll_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('DocumentType')
class DocumentType extends Node {
  DocumentType.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.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('DOMError')
class DomError extends NativeFieldWrapperClass1 {
  DomError.internal();

  @DomName('DOMError.name')
  @DocsEditable
  String get name native "DOMError_name_Getter";

}
// 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.


@DomName('DOMException')
class DomException extends NativeFieldWrapperClass1 {

  static const String INDEX_SIZE = 'IndexSizeError';
  static const String HIERARCHY_REQUEST = 'HierarchyRequestError';
  static const String WRONG_DOCUMENT = 'WrongDocumentError';
  static const String INVALID_CHARACTER = 'InvalidCharacterError';
  static const String NO_MODIFICATION_ALLOWED = 'NoModificationAllowedError';
  static const String NOT_FOUND = 'NotFoundError';
  static const String NOT_SUPPORTED = 'NotSupportedError';
  static const String INVALID_STATE = 'InvalidStateError';
  static const String SYNTAX = 'SyntaxError';
  static const String INVALID_MODIFICATION = 'InvalidModificationError';
  static const String NAMESPACE = 'NamespaceError';
  static const String INVALID_ACCESS = 'InvalidAccessError';
  static const String TYPE_MISMATCH = 'TypeMismatchError';
  static const String SECURITY = 'SecurityError';
  static const String NETWORK = 'NetworkError';
  static const String ABORT = 'AbortError';
  static const String URL_MISMATCH = 'URLMismatchError';
  static const String QUOTA_EXCEEDED = 'QuotaExceededError';
  static const String TIMEOUT = 'TimeoutError';
  static const String INVALID_NODE_TYPE = 'InvalidNodeTypeError';
  static const String DATA_CLONE = 'DataCloneError';

  DomException.internal();

  @DomName('DOMCoreException.message')
  @DocsEditable
  String get message native "DOMCoreException_message_Getter";

  @DomName('DOMCoreException.name')
  @DocsEditable
  String get name native "DOMCoreException_name_Getter";

  @DomName('DOMCoreException.toString')
  @DocsEditable
  String toString() native "DOMCoreException_toString_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('DOMImplementation')
class DomImplementation extends NativeFieldWrapperClass1 {
  DomImplementation.internal();

  @DomName('DOMImplementation.createCSSStyleSheet')
  @DocsEditable
  CssStyleSheet createCssStyleSheet(String title, String media) native "DOMImplementation_createCSSStyleSheet_Callback";

  @DomName('DOMImplementation.createDocument')
  @DocsEditable
  Document createDocument(String namespaceURI, String qualifiedName, DocumentType doctype) native "DOMImplementation_createDocument_Callback";

  @DomName('DOMImplementation.createDocumentType')
  @DocsEditable
  DocumentType createDocumentType(String qualifiedName, String publicId, String systemId) native "DOMImplementation_createDocumentType_Callback";

  @DomName('DOMImplementation.createHTMLDocument')
  @DocsEditable
  HtmlDocument createHtmlDocument(String title) native "DOMImplementation_createHTMLDocument_Callback";

  @DomName('DOMImplementation.hasFeature')
  @DocsEditable
  bool hasFeature(String feature, String version) native "DOMImplementation_hasFeature_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('MimeType')
class DomMimeType extends NativeFieldWrapperClass1 {
  DomMimeType.internal();

  @DomName('DOMMimeType.description')
  @DocsEditable
  String get description native "DOMMimeType_description_Getter";

  @DomName('DOMMimeType.enabledPlugin')
  @DocsEditable
  DomPlugin get enabledPlugin native "DOMMimeType_enabledPlugin_Getter";

  @DomName('DOMMimeType.suffixes')
  @DocsEditable
  String get suffixes native "DOMMimeType_suffixes_Getter";

  @DomName('DOMMimeType.type')
  @DocsEditable
  String get type native "DOMMimeType_type_Getter";

}
// 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.


@DocsEditable
@DomName('MimeTypeArray')
class DomMimeTypeArray extends NativeFieldWrapperClass1 implements List<DomMimeType> {
  DomMimeTypeArray.internal();

  @DomName('DOMMimeTypeArray.length')
  @DocsEditable
  int get length native "DOMMimeTypeArray_length_Getter";

  DomMimeType operator[](int index) native "DOMMimeTypeArray_item_Callback";

  void operator[]=(int index, DomMimeType value) {
    throw new UnsupportedError("Cannot assign element of immutable List.");
  }
  // -- start List<DomMimeType> mixins.
  // DomMimeType is the element type.

  // From Iterable<DomMimeType>:

  Iterator<DomMimeType> 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<DomMimeType>(this);
  }

  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, DomMimeType)) {
    return IterableMixinWorkaround.reduce(this, initialValue, combine);
  }

  bool contains(DomMimeType element) => IterableMixinWorkaround.contains(this, element);

  void forEach(void f(DomMimeType element)) => IterableMixinWorkaround.forEach(this, f);

  String join([String separator]) =>
      IterableMixinWorkaround.joinList(this, separator);

  Iterable map(f(DomMimeType element)) =>
      IterableMixinWorkaround.mapList(this, f);

  Iterable<DomMimeType> where(bool f(DomMimeType element)) =>
      IterableMixinWorkaround.where(this, f);

  Iterable expand(Iterable f(DomMimeType element)) =>
      IterableMixinWorkaround.expand(this, f);

  bool every(bool f(DomMimeType element)) => IterableMixinWorkaround.every(this, f);

  bool any(bool f(DomMimeType element)) => IterableMixinWorkaround.any(this, f);

  List<DomMimeType> toList({ bool growable: true }) =>
      new List<DomMimeType>.from(this, growable: growable);

  Set<DomMimeType> toSet() => new Set<DomMimeType>.from(this);

  bool get isEmpty => this.length == 0;

  Iterable<DomMimeType> take(int n) => IterableMixinWorkaround.takeList(this, n);

  Iterable<DomMimeType> takeWhile(bool test(DomMimeType value)) {
    return IterableMixinWorkaround.takeWhile(this, test);
  }

  Iterable<DomMimeType> skip(int n) => IterableMixinWorkaround.skipList(this, n);

  Iterable<DomMimeType> skipWhile(bool test(DomMimeType value)) {
    return IterableMixinWorkaround.skipWhile(this, test);
  }

  DomMimeType firstWhere(bool test(DomMimeType value), { DomMimeType orElse() }) {
    return IterableMixinWorkaround.firstWhere(this, test, orElse);
  }

  DomMimeType lastWhere(bool test(DomMimeType value), {DomMimeType orElse()}) {
    return IterableMixinWorkaround.lastWhereList(this, test, orElse);
  }

  DomMimeType singleWhere(bool test(DomMimeType value)) {
    return IterableMixinWorkaround.singleWhere(this, test);
  }

  DomMimeType elementAt(int index) {
    return this[index];
  }

  // From Collection<DomMimeType>:

  void add(DomMimeType value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(DomMimeType value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Iterable<DomMimeType> iterable) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  // From List<DomMimeType>:
  void set length(int value) {
    throw new UnsupportedError("Cannot resize immutable List.");
  }

  void clear() {
    throw new UnsupportedError("Cannot clear immutable List.");
  }

  Iterable<DomMimeType> get reversed {
    return IterableMixinWorkaround.reversedList(this);
  }

  void sort([int compare(DomMimeType a, DomMimeType b)]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(DomMimeType element, [int start = 0]) =>
      Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(DomMimeType element, [int start]) {
    if (start == null) start = length - 1;
    return Lists.lastIndexOf(this, element, start);
  }

  DomMimeType get first {
    if (this.length > 0) return this[0];
    throw new StateError("No elements");
  }

  DomMimeType get last {
    if (this.length > 0) return this[this.length - 1];
    throw new StateError("No elements");
  }

  DomMimeType get single {
    if (length == 1) return this[0];
    if (length == 0) throw new StateError("No elements");
    throw new StateError("More than one element");
  }

  DomMimeType min([int compare(DomMimeType a, DomMimeType b)]) =>
      IterableMixinWorkaround.min(this, compare);

  DomMimeType max([int compare(DomMimeType a, DomMimeType b)]) =>
      IterableMixinWorkaround.max(this, compare);

  void insert(int index, DomMimeType element) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  DomMimeType removeAt(int pos) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  DomMimeType removeLast() {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void remove(Object object) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void removeAll(Iterable elements) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void retainAll(Iterable elements) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void removeWhere(bool test(DomMimeType element)) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void retainWhere(bool test(DomMimeType element)) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void setRange(int start, int rangeLength, List<DomMimeType> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [DomMimeType initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<DomMimeType> sublist(int start, [int end]) {
    if (end == null) end = length;
    return Lists.getRange(this, start, end, <DomMimeType>[]);
  }

  List<DomMimeType> getRange(int start, int rangeLength) =>
      sublist(start, start + rangeLength);

  Map<int, DomMimeType> asMap() =>
    IterableMixinWorkaround.asMapList(this);

  // -- end List<DomMimeType> mixins.

  @DomName('DOMMimeTypeArray.item')
  @DocsEditable
  DomMimeType item(int index) native "DOMMimeTypeArray_item_Callback";

  @DomName('DOMMimeTypeArray.namedItem')
  @DocsEditable
  DomMimeType namedItem(String name) native "DOMMimeTypeArray_namedItem_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('DOMParser')
class DomParser extends NativeFieldWrapperClass1 {
  DomParser.internal();

  @DomName('DOMParser.DOMParser')
  @DocsEditable
  factory DomParser() {
    return DomParser._create_1();
  }

  @DocsEditable
  static DomParser _create_1() native "DOMParser__create_1constructorCallback";

  @DomName('DOMParser.parseFromString')
  @DocsEditable
  Document parseFromString(String str, String contentType) native "DOMParser_parseFromString_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('Plugin')
class DomPlugin extends NativeFieldWrapperClass1 {
  DomPlugin.internal();

  @DomName('DOMPlugin.description')
  @DocsEditable
  String get description native "DOMPlugin_description_Getter";

  @DomName('DOMPlugin.filename')
  @DocsEditable
  String get filename native "DOMPlugin_filename_Getter";

  @DomName('DOMPlugin.length')
  @DocsEditable
  int get length native "DOMPlugin_length_Getter";

  @DomName('DOMPlugin.name')
  @DocsEditable
  String get name native "DOMPlugin_name_Getter";

  @DomName('DOMPlugin.item')
  @DocsEditable
  DomMimeType item(int index) native "DOMPlugin_item_Callback";

  @DomName('DOMPlugin.namedItem')
  @DocsEditable
  DomMimeType namedItem(String name) native "DOMPlugin_namedItem_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('PluginArray')
class DomPluginArray extends NativeFieldWrapperClass1 implements List<DomPlugin> {
  DomPluginArray.internal();

  @DomName('DOMPluginArray.length')
  @DocsEditable
  int get length native "DOMPluginArray_length_Getter";

  DomPlugin operator[](int index) native "DOMPluginArray_item_Callback";

  void operator[]=(int index, DomPlugin value) {
    throw new UnsupportedError("Cannot assign element of immutable List.");
  }
  // -- start List<DomPlugin> mixins.
  // DomPlugin is the element type.

  // From Iterable<DomPlugin>:

  Iterator<DomPlugin> 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<DomPlugin>(this);
  }

  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, DomPlugin)) {
    return IterableMixinWorkaround.reduce(this, initialValue, combine);
  }

  bool contains(DomPlugin element) => IterableMixinWorkaround.contains(this, element);

  void forEach(void f(DomPlugin element)) => IterableMixinWorkaround.forEach(this, f);

  String join([String separator]) =>
      IterableMixinWorkaround.joinList(this, separator);

  Iterable map(f(DomPlugin element)) =>
      IterableMixinWorkaround.mapList(this, f);

  Iterable<DomPlugin> where(bool f(DomPlugin element)) =>
      IterableMixinWorkaround.where(this, f);

  Iterable expand(Iterable f(DomPlugin element)) =>
      IterableMixinWorkaround.expand(this, f);

  bool every(bool f(DomPlugin element)) => IterableMixinWorkaround.every(this, f);

  bool any(bool f(DomPlugin element)) => IterableMixinWorkaround.any(this, f);

  List<DomPlugin> toList({ bool growable: true }) =>
      new List<DomPlugin>.from(this, growable: growable);

  Set<DomPlugin> toSet() => new Set<DomPlugin>.from(this);

  bool get isEmpty => this.length == 0;

  Iterable<DomPlugin> take(int n) => IterableMixinWorkaround.takeList(this, n);

  Iterable<DomPlugin> takeWhile(bool test(DomPlugin value)) {
    return IterableMixinWorkaround.takeWhile(this, test);
  }

  Iterable<DomPlugin> skip(int n) => IterableMixinWorkaround.skipList(this, n);

  Iterable<DomPlugin> skipWhile(bool test(DomPlugin value)) {
    return IterableMixinWorkaround.skipWhile(this, test);
  }

  DomPlugin firstWhere(bool test(DomPlugin value), { DomPlugin orElse() }) {
    return IterableMixinWorkaround.firstWhere(this, test, orElse);
  }

  DomPlugin lastWhere(bool test(DomPlugin value), {DomPlugin orElse()}) {
    return IterableMixinWorkaround.lastWhereList(this, test, orElse);
  }

  DomPlugin singleWhere(bool test(DomPlugin value)) {
    return IterableMixinWorkaround.singleWhere(this, test);
  }

  DomPlugin elementAt(int index) {
    return this[index];
  }

  // From Collection<DomPlugin>:

  void add(DomPlugin value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(DomPlugin value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Iterable<DomPlugin> iterable) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  // From List<DomPlugin>:
  void set length(int value) {
    throw new UnsupportedError("Cannot resize immutable List.");
  }

  void clear() {
    throw new UnsupportedError("Cannot clear immutable List.");
  }

  Iterable<DomPlugin> get reversed {
    return IterableMixinWorkaround.reversedList(this);
  }

  void sort([int compare(DomPlugin a, DomPlugin b)]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(DomPlugin element, [int start = 0]) =>
      Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(DomPlugin element, [int start]) {
    if (start == null) start = length - 1;
    return Lists.lastIndexOf(this, element, start);
  }

  DomPlugin get first {
    if (this.length > 0) return this[0];
    throw new StateError("No elements");
  }

  DomPlugin get last {
    if (this.length > 0) return this[this.length - 1];
    throw new StateError("No elements");
  }

  DomPlugin get single {
    if (length == 1) return this[0];
    if (length == 0) throw new StateError("No elements");
    throw new StateError("More than one element");
  }

  DomPlugin min([int compare(DomPlugin a, DomPlugin b)]) =>
      IterableMixinWorkaround.min(this, compare);

  DomPlugin max([int compare(DomPlugin a, DomPlugin b)]) =>
      IterableMixinWorkaround.max(this, compare);

  void insert(int index, DomPlugin element) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  DomPlugin removeAt(int pos) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  DomPlugin removeLast() {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void remove(Object object) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void removeAll(Iterable elements) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void retainAll(Iterable elements) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void removeWhere(bool test(DomPlugin element)) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void retainWhere(bool test(DomPlugin element)) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void setRange(int start, int rangeLength, List<DomPlugin> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [DomPlugin initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<DomPlugin> sublist(int start, [int end]) {
    if (end == null) end = length;
    return Lists.getRange(this, start, end, <DomPlugin>[]);
  }

  List<DomPlugin> getRange(int start, int rangeLength) =>
      sublist(start, start + rangeLength);

  Map<int, DomPlugin> asMap() =>
    IterableMixinWorkaround.asMapList(this);

  // -- end List<DomPlugin> mixins.

  @DomName('DOMPluginArray.item')
  @DocsEditable
  DomPlugin item(int index) native "DOMPluginArray_item_Callback";

  @DomName('DOMPluginArray.namedItem')
  @DocsEditable
  DomPlugin namedItem(String name) native "DOMPluginArray_namedItem_Callback";

  @DomName('DOMPluginArray.refresh')
  @DocsEditable
  void refresh(bool reload) native "DOMPluginArray_refresh_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('WebKitPoint')
@SupportedBrowser(SupportedBrowser.CHROME)
@SupportedBrowser(SupportedBrowser.SAFARI)
@Experimental
class DomPoint extends NativeFieldWrapperClass1 {
  DomPoint.internal();
  factory DomPoint(num x, num y) => _create(x, y);

  @DocsEditable
  static DomPoint _create(x, y) native "WebKitPoint_constructorCallback";

  /// Checks if this type is supported on the current platform.
  static bool get supported => true;

  @DomName('WebKitPoint.x')
  @DocsEditable
  num get x native "WebKitPoint_x_Getter";

  @DomName('WebKitPoint.x')
  @DocsEditable
  void set x(num value) native "WebKitPoint_x_Setter";

  @DomName('WebKitPoint.y')
  @DocsEditable
  num get y native "WebKitPoint_y_Getter";

  @DomName('WebKitPoint.y')
  @DocsEditable
  void set y(num value) native "WebKitPoint_y_Setter";

}
// 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.


@DocsEditable
@DomName('Selection')
class DomSelection extends NativeFieldWrapperClass1 {
  DomSelection.internal();

  @DomName('DOMSelection.anchorNode')
  @DocsEditable
  Node get anchorNode native "DOMSelection_anchorNode_Getter";

  @DomName('DOMSelection.anchorOffset')
  @DocsEditable
  int get anchorOffset native "DOMSelection_anchorOffset_Getter";

  @DomName('DOMSelection.baseNode')
  @DocsEditable
  Node get baseNode native "DOMSelection_baseNode_Getter";

  @DomName('DOMSelection.baseOffset')
  @DocsEditable
  int get baseOffset native "DOMSelection_baseOffset_Getter";

  @DomName('DOMSelection.extentNode')
  @DocsEditable
  Node get extentNode native "DOMSelection_extentNode_Getter";

  @DomName('DOMSelection.extentOffset')
  @DocsEditable
  int get extentOffset native "DOMSelection_extentOffset_Getter";

  @DomName('DOMSelection.focusNode')
  @DocsEditable
  Node get focusNode native "DOMSelection_focusNode_Getter";

  @DomName('DOMSelection.focusOffset')
  @DocsEditable
  int get focusOffset native "DOMSelection_focusOffset_Getter";

  @DomName('DOMSelection.isCollapsed')
  @DocsEditable
  bool get isCollapsed native "DOMSelection_isCollapsed_Getter";

  @DomName('DOMSelection.rangeCount')
  @DocsEditable
  int get rangeCount native "DOMSelection_rangeCount_Getter";

  @DomName('DOMSelection.type')
  @DocsEditable
  String get type native "DOMSelection_type_Getter";

  @DomName('DOMSelection.addRange')
  @DocsEditable
  void addRange(Range range) native "DOMSelection_addRange_Callback";

  @DomName('DOMSelection.collapse')
  @DocsEditable
  void collapse(Node node, int index) native "DOMSelection_collapse_Callback";

  @DomName('DOMSelection.collapseToEnd')
  @DocsEditable
  void collapseToEnd() native "DOMSelection_collapseToEnd_Callback";

  @DomName('DOMSelection.collapseToStart')
  @DocsEditable
  void collapseToStart() native "DOMSelection_collapseToStart_Callback";

  @DomName('DOMSelection.containsNode')
  @DocsEditable
  bool containsNode(Node node, bool allowPartial) native "DOMSelection_containsNode_Callback";

  @DomName('DOMSelection.deleteFromDocument')
  @DocsEditable
  void deleteFromDocument() native "DOMSelection_deleteFromDocument_Callback";

  @DomName('DOMSelection.empty')
  @DocsEditable
  void empty() native "DOMSelection_empty_Callback";

  @DomName('DOMSelection.extend')
  @DocsEditable
  void extend(Node node, int offset) native "DOMSelection_extend_Callback";

  @DomName('DOMSelection.getRangeAt')
  @DocsEditable
  Range getRangeAt(int index) native "DOMSelection_getRangeAt_Callback";

  @DomName('DOMSelection.modify')
  @DocsEditable
  void modify(String alter, String direction, String granularity) native "DOMSelection_modify_Callback";

  @DomName('DOMSelection.removeAllRanges')
  @DocsEditable
  void removeAllRanges() native "DOMSelection_removeAllRanges_Callback";

  @DomName('DOMSelection.selectAllChildren')
  @DocsEditable
  void selectAllChildren(Node node) native "DOMSelection_selectAllChildren_Callback";

  @DomName('DOMSelection.setBaseAndExtent')
  @DocsEditable
  void setBaseAndExtent(Node baseNode, int baseOffset, Node extentNode, int extentOffset) native "DOMSelection_setBaseAndExtent_Callback";

  @DomName('DOMSelection.setPosition')
  @DocsEditable
  void setPosition(Node node, int offset) native "DOMSelection_setPosition_Callback";

  @DomName('DOMSelection.toString')
  @DocsEditable
  String toString() native "DOMSelection_toString_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('DOMSettableTokenList')
class DomSettableTokenList extends DomTokenList {
  DomSettableTokenList.internal() : super.internal();

  @DomName('DOMSettableTokenList.value')
  @DocsEditable
  String get value native "DOMSettableTokenList_value_Getter";

  @DomName('DOMSettableTokenList.value')
  @DocsEditable
  void set value(String value) native "DOMSettableTokenList_value_Setter";

}
// 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.


@DocsEditable
@DomName('DOMStringList')
class DomStringList extends NativeFieldWrapperClass1 implements List<String> {
  DomStringList.internal();

  @DomName('DOMStringList.length')
  @DocsEditable
  int get length native "DOMStringList_length_Getter";

  String operator[](int index) native "DOMStringList_item_Callback";

  void operator[]=(int index, String value) {
    throw new UnsupportedError("Cannot assign element of immutable List.");
  }
  // -- start List<String> mixins.
  // String is the element type.

  // From Iterable<String>:

  Iterator<String> 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<String>(this);
  }

  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, String)) {
    return IterableMixinWorkaround.reduce(this, initialValue, combine);
  }

  // contains() defined by IDL.

  void forEach(void f(String element)) => IterableMixinWorkaround.forEach(this, f);

  String join([String separator]) =>
      IterableMixinWorkaround.joinList(this, separator);

  Iterable map(f(String element)) =>
      IterableMixinWorkaround.mapList(this, f);

  Iterable<String> where(bool f(String element)) =>
      IterableMixinWorkaround.where(this, f);

  Iterable expand(Iterable f(String element)) =>
      IterableMixinWorkaround.expand(this, f);

  bool every(bool f(String element)) => IterableMixinWorkaround.every(this, f);

  bool any(bool f(String element)) => IterableMixinWorkaround.any(this, f);

  List<String> toList({ bool growable: true }) =>
      new List<String>.from(this, growable: growable);

  Set<String> toSet() => new Set<String>.from(this);

  bool get isEmpty => this.length == 0;

  Iterable<String> take(int n) => IterableMixinWorkaround.takeList(this, n);

  Iterable<String> takeWhile(bool test(String value)) {
    return IterableMixinWorkaround.takeWhile(this, test);
  }

  Iterable<String> skip(int n) => IterableMixinWorkaround.skipList(this, n);

  Iterable<String> skipWhile(bool test(String value)) {
    return IterableMixinWorkaround.skipWhile(this, test);
  }

  String firstWhere(bool test(String value), { String orElse() }) {
    return IterableMixinWorkaround.firstWhere(this, test, orElse);
  }

  String lastWhere(bool test(String value), {String orElse()}) {
    return IterableMixinWorkaround.lastWhereList(this, test, orElse);
  }

  String singleWhere(bool test(String value)) {
    return IterableMixinWorkaround.singleWhere(this, test);
  }

  String elementAt(int index) {
    return this[index];
  }

  // From Collection<String>:

  void add(String value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(String value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Iterable<String> iterable) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  // From List<String>:
  void set length(int value) {
    throw new UnsupportedError("Cannot resize immutable List.");
  }

  void clear() {
    throw new UnsupportedError("Cannot clear immutable List.");
  }

  Iterable<String> get reversed {
    return IterableMixinWorkaround.reversedList(this);
  }

  void sort([int compare(String a, String b)]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(String element, [int start = 0]) =>
      Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(String element, [int start]) {
    if (start == null) start = length - 1;
    return Lists.lastIndexOf(this, element, start);
  }

  String get first {
    if (this.length > 0) return this[0];
    throw new StateError("No elements");
  }

  String get last {
    if (this.length > 0) return this[this.length - 1];
    throw new StateError("No elements");
  }

  String get single {
    if (length == 1) return this[0];
    if (length == 0) throw new StateError("No elements");
    throw new StateError("More than one element");
  }

  String min([int compare(String a, String b)]) =>
      IterableMixinWorkaround.min(this, compare);

  String max([int compare(String a, String b)]) =>
      IterableMixinWorkaround.max(this, compare);

  void insert(int index, String element) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  String removeAt(int pos) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  String removeLast() {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void remove(Object object) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void removeAll(Iterable elements) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void retainAll(Iterable elements) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void removeWhere(bool test(String element)) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void retainWhere(bool test(String element)) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void setRange(int start, int rangeLength, List<String> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [String initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<String> sublist(int start, [int end]) {
    if (end == null) end = length;
    return Lists.getRange(this, start, end, <String>[]);
  }

  List<String> getRange(int start, int rangeLength) =>
      sublist(start, start + rangeLength);

  Map<int, String> asMap() =>
    IterableMixinWorkaround.asMapList(this);

  // -- end List<String> mixins.

  @DomName('DOMStringList.contains')
  @DocsEditable
  bool contains(String string) native "DOMStringList_contains_Callback";

  @DomName('DOMStringList.item')
  @DocsEditable
  String item(int index) native "DOMStringList_item_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('DOMStringMap')
class DomStringMap extends NativeFieldWrapperClass1 {
  DomStringMap.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.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('DOMTokenList')
class DomTokenList extends NativeFieldWrapperClass1 {
  DomTokenList.internal();

  @DomName('DOMTokenList.length')
  @DocsEditable
  int get length native "DOMTokenList_length_Getter";

  @DomName('DOMTokenList.contains')
  @DocsEditable
  bool contains(String token) native "DOMTokenList_contains_Callback";

  @DomName('DOMTokenList.item')
  @DocsEditable
  String item(int index) native "DOMTokenList_item_Callback";

  @DomName('DOMTokenList.toString')
  @DocsEditable
  String toString() native "DOMTokenList_toString_Callback";

  bool toggle(String token, [bool force]) {
    if (?force) {
      return _toggle_1(token, force);
    }
    return _toggle_2(token);
  }

  @DomName('DOMTokenList._toggle_1')
  @DocsEditable
  bool _toggle_1(token, force) native "DOMTokenList__toggle_1_Callback";

  @DomName('DOMTokenList._toggle_2')
  @DocsEditable
  bool _toggle_2(token) native "DOMTokenList__toggle_2_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.


// TODO(jacobr): use _Lists.dart to remove some of the duplicated
// functionality.
class _ChildrenElementList implements List {
  // Raw Element.
  final Element _element;
  final HtmlCollection _childElements;

  _ChildrenElementList._wrap(Element element)
    : _childElements = element.$dom_children,
      _element = element;

  List<Element> toList({ bool growable: true }) {
    List<Element> output;
    if (growable) {
      output = <Element>[];
      output.length = _childElements.length;
    } else {
      output = new List<Element>(_childElements.length);
    }
    for (int i = 0, len = _childElements.length; i < len; i++) {
      output[i] = _childElements[i];
    }
    return output;
  }

  Set<Element> toSet() {
    final output = new Set<Element>();
    for (int i = 0, len = _childElements.length; i < len; i++) {
      output.add(_childElements[i]);
    }
    return output;
  }

  bool contains(Element element) => _childElements.contains(element);

  void forEach(void f(Element element)) {
    for (Element element in _childElements) {
      f(element);
    }
  }

  bool every(bool f(Element element)) {
    for (Element element in this) {
      if (!f(element)) {
        return false;
      }
    }
    return true;
  }

  bool any(bool f(Element element)) {
    for (Element element in this) {
      if (f(element)) {
        return true;
      }
    }
    return false;
  }

  String join([String separator]) {
    return IterableMixinWorkaround.joinList(this, separator);
  }

  Iterable map(f(Element element)) {
    return IterableMixinWorkaround.mapList(this, f);
  }

  Iterable<Element> where(bool f(Element element)) {
    return IterableMixinWorkaround.where(this, f);
  }

  Iterable expand(Iterable f(Element element)) {
    return IterableMixinWorkaround.expand(this, f);
  }

  bool get isEmpty {
    return _element.$dom_firstElementChild == null;
  }

  Iterable<Element> take(int n) {
    return IterableMixinWorkaround.takeList(this, n);
  }

  Iterable<Element> takeWhile(bool test(Element value)) {
    return IterableMixinWorkaround.takeWhile(this, test);
  }

  Iterable<Element> skip(int n) {
    return IterableMixinWorkaround.skipList(this, n);
  }

  Iterable<Element> skipWhile(bool test(Element value)) {
    return IterableMixinWorkaround.skipWhile(this, test);
  }

  Element firstWhere(bool test(Element value), {Element orElse()}) {
    return IterableMixinWorkaround.firstWhere(this, test, orElse);
  }

  Element lastWhere(bool test(Element value), {Element orElse()}) {
    return IterableMixinWorkaround.lastWhereList(this, test, orElse);
  }

  Element singleWhere(bool test(Element value)) {
    return IterableMixinWorkaround.singleWhere(this, test);
  }

  Element elementAt(int index) {
    return this[index];
  }

  int get length {
    return _childElements.length;
  }

  Element operator [](int index) {
    return _childElements[index];
  }

  void operator []=(int index, Element value) {
    _element.$dom_replaceChild(value, _childElements[index]);
  }

  void set length(int newLength) {
    // TODO(jacobr): remove children when length is reduced.
    throw new UnsupportedError('');
  }

  Element add(Element value) {
    _element.append(value);
    return value;
  }

  Element addLast(Element value) => add(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);
    }
  }

  Iterable<Element> get reversed {
    return IterableMixinWorkaround.reversedList(this);
  }

  void sort([int compare(Element a, Element b)]) {
    throw new UnsupportedError('TODO(jacobr): should we impl?');
  }

  dynamic reduce(dynamic initialValue,
      dynamic combine(dynamic previousValue, Element element)) {
    return IterableMixinWorkaround.reduce(this, initialValue, combine);
  }

  void setRange(int start, int rangeLength, List from, [int startFrom = 0]) {
    throw new UnimplementedError();
  }

  void remove(Object object) {
    if (object is Element) {
      Element element = object;
      if (identical(element.parentNode, _element)) {
        _element.$dom_removeChild(element);
      }
    }
  }

  void removeAll(Iterable elements) {
    IterableMixinWorkaround.removeAll(this, elements);
  }

  void retainAll(Iterable elements) {
    IterableMixinWorkaround.retainAll(this, elements);
  }

  void removeWhere(bool test(Element element)) {
    IterableMixinWorkaround.removeWhere(this, test);
  }

  void retainWhere(bool test(Element element)) {
    IterableMixinWorkaround.retainWhere(this, test);
  }

  void removeRange(int start, int rangeLength) {
    throw new UnimplementedError();
  }

  void insertRange(int start, int rangeLength, [initialValue = null]) {
    throw new UnimplementedError();
  }

  List sublist(int start, [int end]) {
    if (end == null) end = length;
    return new _FrozenElementList._wrap(Lists.getRange(this, start, end, []));
  }

  List getRange(int start, int rangeLength) =>
      sublist(start, start + rangeLength);

  int indexOf(Element element, [int start = 0]) {
    return Lists.indexOf(this, element, start, this.length);
  }

  int lastIndexOf(Element element, [int start = null]) {
    if (start == null) start = length - 1;
    return Lists.lastIndexOf(this, element, start);
  }

  void insert(int index, Element element) {
    if (index < 0 || index > length) {
      throw new RangeError.range(index, 0, length);
    }
    if (index == length) {
      _element.append(element);
    } else {
      throw new UnimplementedError("insert on ElementLists");
    }
  }

  void clear() {
    // It is unclear if we want to keep non element nodes?
    _element.text = '';
  }

  Element removeAt(int index) {
    final result = this[index];
    if (result != null) {
      _element.$dom_removeChild(result);
    }
    return result;
  }

  Element removeLast() {
    final result = this.last;
    if (result != null) {
      _element.$dom_removeChild(result);
    }
    return result;
  }

  Element get first {
    Element result = _element.$dom_firstElementChild;
    if (result == null) throw new StateError("No elements");
    return result;
  }


  Element get last {
    Element result = _element.$dom_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;
  }

  Element min([int compare(Element a, Element b)]) {
    return IterableMixinWorkaround.min(this, compare);
  }

  Element max([int compare(Element a, Element b)]) {
    return IterableMixinWorkaround.max(this, compare);
  }

  Map<int, Element> asMap() {
    return IterableMixinWorkaround.asMapList(this);
  }
}

// TODO(jacobr): this is an inefficient implementation but it is hard to see
// a better option given that we cannot quite force NodeList to be an
// ElementList as there are valid cases where a NodeList JavaScript object
// contains Node objects that are not Elements.
class _FrozenElementList implements List {
  final List<Node> _nodeList;

  _FrozenElementList._wrap(this._nodeList);

  bool contains(Element element) {
    for (Element el in this) {
      if (el == element) return true;
    }
    return false;
  }

  void forEach(void f(Element element)) {
    for (Element el in this) {
      f(el);
    }
  }

  String join([String separator]) {
    return IterableMixinWorkaround.joinList(this, separator);
  }

  Iterable map(f(Element element)) {
    return IterableMixinWorkaround.mapList(this, f);
  }

  Iterable<Element> where(bool f(Element element)) {
    return IterableMixinWorkaround.where(this, f);
  }

  Iterable expand(Iterable f(Element element)) {
    return IterableMixinWorkaround.expand(this, f);
  }

  bool every(bool f(Element element)) {
    for(Element element in this) {
      if (!f(element)) {
        return false;
      }
    };
    return true;
  }

  bool any(bool f(Element element)) {
    for(Element element in this) {
      if (f(element)) {
        return true;
      }
    };
    return false;
  }

  List<Element> toList({ bool growable: true }) =>
      new List<Element>.from(this, growable: growable);
  Set<Element> toSet() => new Set<Element>.from(this);

  Iterable<Element> take(int n) {
    return IterableMixinWorkaround.takeList(this, n);
  }

  Iterable<Element> takeWhile(bool test(Element value)) {
    return IterableMixinWorkaround.takeWhile(this, test);
  }

  Iterable<Element> skip(int n) {
    return IterableMixinWorkaround.skipList(this, n);
  }

  Iterable<Element> skipWhile(bool test(Element value)) {
    return IterableMixinWorkaround.skipWhile(this, test);
  }

  Element firstWhere(bool test(Element value), {Element orElse()}) {
    return IterableMixinWorkaround.firstWhere(this, test, orElse);
  }

  Element lastWhere(bool test(Element value), {Element orElse()}) {
    return IterableMixinWorkaround.lastWhereList(this, test, orElse);
  }

  Element singleWhere(bool test(Element value)) {
    return IterableMixinWorkaround.singleWhere(this, test);
  }

  Element elementAt(int index) {
    return this[index];
  }

  bool get isEmpty => _nodeList.isEmpty;

  int get length => _nodeList.length;

  Element operator [](int index) => _nodeList[index];

  void operator []=(int index, Element value) {
    throw new UnsupportedError('');
  }

  void set length(int newLength) {
    _nodeList.length = newLength;
  }

  void add(Element value) {
    throw new UnsupportedError('');
  }

  void addLast(Element value) {
    throw new UnsupportedError('');
  }

  Iterator<Element> get iterator => new _FrozenElementListIterator(this);

  void addAll(Iterable<Element> iterable) {
    throw new UnsupportedError('');
  }

  Iterable<Element> get reversed {
    return IterableMixinWorkaround.reversedList(this);
  }

  void sort([int compare(Element a, Element b)]) {
    throw new UnsupportedError('');
  }

  dynamic reduce(dynamic initialValue,
      dynamic combine(dynamic previousValue, Element element)) {
    return IterableMixinWorkaround.reduce(this, initialValue, combine);
  }

  void setRange(int start, int rangeLength, List from, [int startFrom = 0]) {
    throw new UnsupportedError('');
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError('');
  }

  void insertRange(int start, int rangeLength, [initialValue = null]) {
    throw new UnsupportedError('');
  }

  List<Element> sublist(int start, [int end]) {
    return new _FrozenElementList._wrap(_nodeList.sublist(start, end));
  }

  List<Element> getRange(int start, int rangeLength) =>
      sublist(start, start + rangeLength);

  int indexOf(Element element, [int start = 0]) =>
    _nodeList.indexOf(element, start);

  int lastIndexOf(Element element, [int start = null]) =>
    _nodeList.lastIndexOf(element, start);

  void clear() {
    throw new UnsupportedError('');
  }

  Element removeAt(int index) {
    throw new UnsupportedError('');
  }

  Element removeLast() {
    throw new UnsupportedError('');
  }

  void remove(Object element) {
    throw new UnsupportedError('');
  }

  void removeAll(Iterable elements) {
    throw new UnsupportedError('');
  }

  void retainAll(Iterable elements) {
    throw new UnsupportedError('');
  }

  void removeWhere(bool test(Element element)) {
    throw new UnsupportedError('');
  }

  void retainWhere(bool test(Element element)) {
    throw new UnsupportedError('');
  }

  Element get first => _nodeList.first;

  Element get last => _nodeList.last;

  Element get single => _nodeList.single;

  Element min([int compare(Element a, Element b)]) {
    return IterableMixinWorkaround.min(this, compare);
  }

  Element max([int compare(Element a, Element b)]) {
    return IterableMixinWorkaround.max(this, compare);
  }

  Map<int, Element> asMap() {
    return IterableMixinWorkaround.asMapList(this);
  }
}

class _FrozenElementListIterator implements Iterator<Element> {
  final _FrozenElementList _list;
  int _index = -1;
  Element _current;

  _FrozenElementListIterator(this._list);

  /**
   * Moves to the next element. Returns true if the iterator is positioned
   * at an element. Returns false if it is positioned after the last element.
   */
  bool moveNext() {
    int nextIndex = _index + 1;
    if (nextIndex < _list.length) {
      _current = _list[nextIndex];
      _index = nextIndex;
      return true;
    }
    _index = _list.length;
    _current = null;
    return false;
  }

  /**
   * Returns the element the [Iterator] is positioned at.
   *
   * Return [:null:] if the iterator is positioned before the first, or
   * after the last element.
   */
  Element get current => _current;
}

class _ElementCssClassSet extends CssClassSet {

  final Element _element;

  _ElementCssClassSet(this._element);

  Set<String> readClasses() {
    var s = new LinkedHashSet<String>();
    var classname = _element.$dom_className;

    for (String name in classname.split(' ')) {
      String trimmed = name.trim();
      if (!trimmed.isEmpty) {
        s.add(trimmed);
      }
    }
    return s;
  }

  void writeClasses(Set<String> s) {
    List list = new List.from(s);
    _element.$dom_className = s.join(' ');
  }
}

/**
 * An abstract class, which all HTML elements extend.
 */
@DomName('Element')
abstract class Element extends Node implements ElementTraversal {

  /**
   * Creates an HTML element from a valid fragment of HTML.
   *
   * The [html] fragment must represent valid HTML with a single element root,
   * which will be parsed and returned.
   *
   * Important: the contents of [html] should not contain any user-supplied
   * data. Without strict data validation it is impossible to prevent script
   * injection exploits.
   *
   * It is instead recommended that elements be constructed via [Element.tag]
   * and text be added via [text].
   *
   *     var element = new Element.html('<div class="foo">content</div>');
   */
  factory Element.html(String html) =>
      _ElementFactoryProvider.createElement_html(html);

  /**
   * 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) =>
      _ElementFactoryProvider.createElement_tag(tag);

  /**
   * 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);

  void 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);

  void 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.query('.itemClassName');
   */
  List<Element> queryAll(String selectors) =>
    new _FrozenElementList._wrap($dom_querySelectorAll(selectors));

  /**
   * 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);

  void set classes(Collection<String> value) {
    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);

  void 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.$dom_getComputedStyle(this, pseudoElement);
  }

  @deprecated
  int get clientHeight => client.height;
  @deprecated
  int get clientLeft => client.left;
  @deprecated
  int get clientTop => client.top;
  @deprecated
  int get clientWidth => client.width;

  @DomName('Element.clientHeight')
  @DomName('Element.clientLeft')
  @DomName('Element.clientTop')
  @DomName('Element.clientWidth')
  Rect get client => new Rect($dom_clientLeft, $dom_clientTop, $dom_clientWidth,
      $dom_clientHeight);

  @deprecated
  int get offsetHeight => offset.height;
  @deprecated
  int get offsetLeft => offset.left;
  @deprecated
  int get offsetTop => offset.top;
  @deprecated
  int get offsetWidth => offset.width;

  @DomName('Element.offsetHeight')
  @DomName('Element.offsetLeft')
  @DomName('Element.offsetTop')
  @DomName('Element.offsetWidth')
  Rect get offset => new Rect($dom_offsetLeft, $dom_offsetTop, $dom_offsetWidth,
      $dom_offsetHeight);

  /**
   * Adds the specified text as a text node after the last child of this
   * element.
   */
  void appendText(String text) {
    this.insertAdjacentText('beforeend', text);
  }

  /**
   * Parses the specified text as HTML and adds the resulting node after the
   * last child of this element.
   */
  void appendHtml(String text) {
    this.insertAdjacentHtml('beforeend', text);
  }

  /**
   * 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);
    return e is Element && !(e is UnknownElement);
  }

  /**
   * Called by the DOM when this element has been instantiated.
   */
  @Experimental
  void onCreated() {}

  // Hooks to support custom WebComponents.
  /**
   * 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 and will simply return this [Element] object.
   *
   * [wc]: http://dvcs.w3.org/hg/webcomponents/raw-file/tip/explainer/index.html
   * [x-tags]: http://x-tags.org/
   */
  var xtag;

  /**
   * 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 = false;
    if (alignment == ScrollAlignment.TOP) {
      this.$dom_scrollIntoView(true);
    } else if (alignment == ScrollAlignment.BOTTOM) {
      this.$dom_scrollIntoView(false);
    } else if (hasScrollIntoViewIfNeeded) {
      if (alignment == ScrollAlignment.CENTER) {
        this.$dom_scrollIntoViewIfNeeded(true);
      } else {
        this.$dom_scrollIntoViewIfNeeded();
      }
    } else {
      this.$dom_scrollIntoView();
    }
  }


  Element.internal() : super.internal();

  @DomName('Element.abortEvent')
  @DocsEditable
  static const EventStreamProvider<Event> abortEvent = const EventStreamProvider<Event>('abort');

  @DomName('Element.beforecopyEvent')
  @DocsEditable
  static const EventStreamProvider<Event> beforeCopyEvent = const EventStreamProvider<Event>('beforecopy');

  @DomName('Element.beforecutEvent')
  @DocsEditable
  static const EventStreamProvider<Event> beforeCutEvent = const EventStreamProvider<Event>('beforecut');

  @DomName('Element.beforepasteEvent')
  @DocsEditable
  static const EventStreamProvider<Event> beforePasteEvent = const EventStreamProvider<Event>('beforepaste');

  @DomName('Element.blurEvent')
  @DocsEditable
  static const EventStreamProvider<Event> blurEvent = const EventStreamProvider<Event>('blur');

  @DomName('Element.changeEvent')
  @DocsEditable
  static const EventStreamProvider<Event> changeEvent = const EventStreamProvider<Event>('change');

  @DomName('Element.clickEvent')
  @DocsEditable
  static const EventStreamProvider<MouseEvent> clickEvent = const EventStreamProvider<MouseEvent>('click');

  @DomName('Element.contextmenuEvent')
  @DocsEditable
  static const EventStreamProvider<MouseEvent> contextMenuEvent = const EventStreamProvider<MouseEvent>('contextmenu');

  @DomName('Element.copyEvent')
  @DocsEditable
  static const EventStreamProvider<Event> copyEvent = const EventStreamProvider<Event>('copy');

  @DomName('Element.cutEvent')
  @DocsEditable
  static const EventStreamProvider<Event> cutEvent = const EventStreamProvider<Event>('cut');

  @DomName('Element.dblclickEvent')
  @DocsEditable
  static const EventStreamProvider<Event> doubleClickEvent = const EventStreamProvider<Event>('dblclick');

  @DomName('Element.dragEvent')
  @DocsEditable
  static const EventStreamProvider<MouseEvent> dragEvent = const EventStreamProvider<MouseEvent>('drag');

  @DomName('Element.dragendEvent')
  @DocsEditable
  static const EventStreamProvider<MouseEvent> dragEndEvent = const EventStreamProvider<MouseEvent>('dragend');

  @DomName('Element.dragenterEvent')
  @DocsEditable
  static const EventStreamProvider<MouseEvent> dragEnterEvent = const EventStreamProvider<MouseEvent>('dragenter');

  @DomName('Element.dragleaveEvent')
  @DocsEditable
  static const EventStreamProvider<MouseEvent> dragLeaveEvent = const EventStreamProvider<MouseEvent>('dragleave');

  @DomName('Element.dragoverEvent')
  @DocsEditable
  static const EventStreamProvider<MouseEvent> dragOverEvent = const EventStreamProvider<MouseEvent>('dragover');

  @DomName('Element.dragstartEvent')
  @DocsEditable
  static const EventStreamProvider<MouseEvent> dragStartEvent = const EventStreamProvider<MouseEvent>('dragstart');

  @DomName('Element.dropEvent')
  @DocsEditable
  static const EventStreamProvider<MouseEvent> dropEvent = const EventStreamProvider<MouseEvent>('drop');

  @DomName('Element.errorEvent')
  @DocsEditable
  static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');

  @DomName('Element.focusEvent')
  @DocsEditable
  static const EventStreamProvider<Event> focusEvent = const EventStreamProvider<Event>('focus');

  @DomName('Element.inputEvent')
  @DocsEditable
  static const EventStreamProvider<Event> inputEvent = const EventStreamProvider<Event>('input');

  @DomName('Element.invalidEvent')
  @DocsEditable
  static const EventStreamProvider<Event> invalidEvent = const EventStreamProvider<Event>('invalid');

  @DomName('Element.keydownEvent')
  @DocsEditable
  static const EventStreamProvider<KeyboardEvent> keyDownEvent = const EventStreamProvider<KeyboardEvent>('keydown');

  @DomName('Element.keypressEvent')
  @DocsEditable
  static const EventStreamProvider<KeyboardEvent> keyPressEvent = const EventStreamProvider<KeyboardEvent>('keypress');

  @DomName('Element.keyupEvent')
  @DocsEditable
  static const EventStreamProvider<KeyboardEvent> keyUpEvent = const EventStreamProvider<KeyboardEvent>('keyup');

  @DomName('Element.loadEvent')
  @DocsEditable
  static const EventStreamProvider<Event> loadEvent = const EventStreamProvider<Event>('load');

  @DomName('Element.mousedownEvent')
  @DocsEditable
  static const EventStreamProvider<MouseEvent> mouseDownEvent = const EventStreamProvider<MouseEvent>('mousedown');

  @DomName('Element.mousemoveEvent')
  @DocsEditable
  static const EventStreamProvider<MouseEvent> mouseMoveEvent = const EventStreamProvider<MouseEvent>('mousemove');

  @DomName('Element.mouseoutEvent')
  @DocsEditable
  static const EventStreamProvider<MouseEvent> mouseOutEvent = const EventStreamProvider<MouseEvent>('mouseout');

  @DomName('Element.mouseoverEvent')
  @DocsEditable
  static const EventStreamProvider<MouseEvent> mouseOverEvent = const EventStreamProvider<MouseEvent>('mouseover');

  @DomName('Element.mouseupEvent')
  @DocsEditable
  static const EventStreamProvider<MouseEvent> mouseUpEvent = const EventStreamProvider<MouseEvent>('mouseup');

  @DomName('Element.mousewheelEvent')
  @DocsEditable
  static const EventStreamProvider<WheelEvent> mouseWheelEvent = const EventStreamProvider<WheelEvent>('mousewheel');

  @DomName('Element.pasteEvent')
  @DocsEditable
  static const EventStreamProvider<Event> pasteEvent = const EventStreamProvider<Event>('paste');

  @DomName('Element.resetEvent')
  @DocsEditable
  static const EventStreamProvider<Event> resetEvent = const EventStreamProvider<Event>('reset');

  @DomName('Element.scrollEvent')
  @DocsEditable
  static const EventStreamProvider<Event> scrollEvent = const EventStreamProvider<Event>('scroll');

  @DomName('Element.searchEvent')
  @DocsEditable
  static const EventStreamProvider<Event> searchEvent = const EventStreamProvider<Event>('search');

  @DomName('Element.selectEvent')
  @DocsEditable
  static const EventStreamProvider<Event> selectEvent = const EventStreamProvider<Event>('select');

  @DomName('Element.selectstartEvent')
  @DocsEditable
  static const EventStreamProvider<Event> selectStartEvent = const EventStreamProvider<Event>('selectstart');

  @DomName('Element.submitEvent')
  @DocsEditable
  static const EventStreamProvider<Event> submitEvent = const EventStreamProvider<Event>('submit');

  @DomName('Element.touchcancelEvent')
  @DocsEditable
  static const EventStreamProvider<TouchEvent> touchCancelEvent = const EventStreamProvider<TouchEvent>('touchcancel');

  @DomName('Element.touchendEvent')
  @DocsEditable
  static const EventStreamProvider<TouchEvent> touchEndEvent = const EventStreamProvider<TouchEvent>('touchend');

  @DomName('Element.touchenterEvent')
  @DocsEditable
  static const EventStreamProvider<TouchEvent> touchEnterEvent = const EventStreamProvider<TouchEvent>('touchenter');

  @DomName('Element.touchleaveEvent')
  @DocsEditable
  static const EventStreamProvider<TouchEvent> touchLeaveEvent = const EventStreamProvider<TouchEvent>('touchleave');

  @DomName('Element.touchmoveEvent')
  @DocsEditable
  static const EventStreamProvider<TouchEvent> touchMoveEvent = const EventStreamProvider<TouchEvent>('touchmove');

  @DomName('Element.touchstartEvent')
  @DocsEditable
  static const EventStreamProvider<TouchEvent> touchStartEvent = const EventStreamProvider<TouchEvent>('touchstart');

  @DomName('Element.webkitTransitionEndEvent')
  @DocsEditable
  @SupportedBrowser(SupportedBrowser.CHROME)
  @SupportedBrowser(SupportedBrowser.SAFARI)
  @Experimental
  static const EventStreamProvider<TransitionEvent> transitionEndEvent = const EventStreamProvider<TransitionEvent>('webkitTransitionEnd');

  @DomName('Element.webkitfullscreenchangeEvent')
  @DocsEditable
  @SupportedBrowser(SupportedBrowser.CHROME)
  @SupportedBrowser(SupportedBrowser.SAFARI)
  @Experimental
  static const EventStreamProvider<Event> fullscreenChangeEvent = const EventStreamProvider<Event>('webkitfullscreenchange');

  @DomName('Element.webkitfullscreenerrorEvent')
  @DocsEditable
  @SupportedBrowser(SupportedBrowser.CHROME)
  @SupportedBrowser(SupportedBrowser.SAFARI)
  @Experimental
  static const EventStreamProvider<Event> fullscreenErrorEvent = const EventStreamProvider<Event>('webkitfullscreenerror');

  HtmlCollection get $dom_children;

  String contentEditable;

  String dir;

  bool draggable;

  bool hidden;

  String id;

  String innerHtml;

  bool get isContentEditable;

  String lang;

  String get outerHtml;

  bool spellcheck;

  int tabIndex;

  String title;

  bool translate;

  String dropzone;

  void click();

  Element insertAdjacentElement(String where, Element element);

  void insertAdjacentHtml(String where, String html);

  void insertAdjacentText(String where, String text);

  static const int ALLOW_KEYBOARD_INPUT = 1;

  @DomName('Element.attributes')
  @DocsEditable
  _NamedNodeMap get $dom_attributes native "Element_attributes_Getter";

  @DomName('Element.childElementCount')
  @DocsEditable
  int get $dom_childElementCount native "Element_childElementCount_Getter";

  @DomName('Element.className')
  @DocsEditable
  String get $dom_className native "Element_className_Getter";

  @DomName('Element.className')
  @DocsEditable
  void set $dom_className(String value) native "Element_className_Setter";

  @DomName('Element.clientHeight')
  @DocsEditable
  int get $dom_clientHeight native "Element_clientHeight_Getter";

  @DomName('Element.clientLeft')
  @DocsEditable
  int get $dom_clientLeft native "Element_clientLeft_Getter";

  @DomName('Element.clientTop')
  @DocsEditable
  int get $dom_clientTop native "Element_clientTop_Getter";

  @DomName('Element.clientWidth')
  @DocsEditable
  int get $dom_clientWidth native "Element_clientWidth_Getter";

  @DomName('Element.firstElementChild')
  @DocsEditable
  Element get $dom_firstElementChild native "Element_firstElementChild_Getter";

  @DomName('Element.lastElementChild')
  @DocsEditable
  Element get $dom_lastElementChild native "Element_lastElementChild_Getter";

  @DomName('Element.nextElementSibling')
  @DocsEditable
  Element get nextElementSibling native "Element_nextElementSibling_Getter";

  @DomName('Element.offsetHeight')
  @DocsEditable
  int get $dom_offsetHeight native "Element_offsetHeight_Getter";

  @DomName('Element.offsetLeft')
  @DocsEditable
  int get $dom_offsetLeft native "Element_offsetLeft_Getter";

  @DomName('Element.offsetParent')
  @DocsEditable
  Element get offsetParent native "Element_offsetParent_Getter";

  @DomName('Element.offsetTop')
  @DocsEditable
  int get $dom_offsetTop native "Element_offsetTop_Getter";

  @DomName('Element.offsetWidth')
  @DocsEditable
  int get $dom_offsetWidth native "Element_offsetWidth_Getter";

  @DomName('Element.previousElementSibling')
  @DocsEditable
  Element get previousElementSibling native "Element_previousElementSibling_Getter";

  @DomName('Element.scrollHeight')
  @DocsEditable
  int get scrollHeight native "Element_scrollHeight_Getter";

  @DomName('Element.scrollLeft')
  @DocsEditable
  int get scrollLeft native "Element_scrollLeft_Getter";

  @DomName('Element.scrollLeft')
  @DocsEditable
  void set scrollLeft(int value) native "Element_scrollLeft_Setter";

  @DomName('Element.scrollTop')
  @DocsEditable
  int get scrollTop native "Element_scrollTop_Getter";

  @DomName('Element.scrollTop')
  @DocsEditable
  void set scrollTop(int value) native "Element_scrollTop_Setter";

  @DomName('Element.scrollWidth')
  @DocsEditable
  int get scrollWidth native "Element_scrollWidth_Getter";

  @DomName('Element.style')
  @DocsEditable
  CssStyleDeclaration get style native "Element_style_Getter";

  @DomName('Element.tagName')
  @DocsEditable
  String get tagName native "Element_tagName_Getter";

  @DomName('Element.webkitPseudo')
  @DocsEditable
  @SupportedBrowser(SupportedBrowser.CHROME)
  @SupportedBrowser(SupportedBrowser.SAFARI)
  @Experimental
  String get pseudo native "Element_webkitPseudo_Getter";

  @DomName('Element.webkitPseudo')
  @DocsEditable
  @SupportedBrowser(SupportedBrowser.CHROME)
  @SupportedBrowser(SupportedBrowser.SAFARI)
  @Experimental
  void set pseudo(String value) native "Element_webkitPseudo_Setter";

  @DomName('Element.webkitShadowRoot')
  @DocsEditable
  @SupportedBrowser(SupportedBrowser.CHROME)
  @SupportedBrowser(SupportedBrowser.SAFARI)
  @Experimental
  ShadowRoot get shadowRoot native "Element_webkitShadowRoot_Getter";

  @DomName('Element.blur')
  @DocsEditable
  void blur() native "Element_blur_Callback";

  @DomName('Element.focus')
  @DocsEditable
  void focus() native "Element_focus_Callback";

  @DomName('Element.getAttribute')
  @DocsEditable
  String $dom_getAttribute(String name) native "Element_getAttribute_Callback";

  @DomName('Element.getAttributeNS')
  @DocsEditable
  String $dom_getAttributeNS(String namespaceURI, String localName) native "Element_getAttributeNS_Callback";

  @DomName('Element.getBoundingClientRect')
  @DocsEditable
  Rect getBoundingClientRect() native "Element_getBoundingClientRect_Callback";

  @DomName('Element.getClientRects')
  @DocsEditable
  List<Rect> getClientRects() native "Element_getClientRects_Callback";

  @DomName('Element.getElementsByClassName')
  @DocsEditable
  List<Node> getElementsByClassName(String name) native "Element_getElementsByClassName_Callback";

  @DomName('Element.getElementsByTagName')
  @DocsEditable
  List<Node> $dom_getElementsByTagName(String name) native "Element_getElementsByTagName_Callback";

  @DomName('Element.hasAttribute')
  @DocsEditable
  bool $dom_hasAttribute(String name) native "Element_hasAttribute_Callback";

  @DomName('Element.hasAttributeNS')
  @DocsEditable
  bool $dom_hasAttributeNS(String namespaceURI, String localName) native "Element_hasAttributeNS_Callback";

  /**
 * 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.query('.className');
 *     // Gets the element with id 'id'
 *     var element = element.query('#id');
 *     // Gets the first descendant [ImageElement]
 *     var img = element.query('img');
 *
 * See also:
 *
 * * [CSS Selectors](http://docs.webplatform.org/wiki/css/selectors)
 */
  @DomName('Element.querySelector')
  @DocsEditable
  Element query(String selectors) native "Element_querySelector_Callback";

  @DomName('Element.querySelectorAll')
  @DocsEditable
  List<Node> $dom_querySelectorAll(String selectors) native "Element_querySelectorAll_Callback";

  @DomName('Element.remove')
  @DocsEditable
  void remove() native "Element_remove_Callback";

  @DomName('Element.removeAttribute')
  @DocsEditable
  void $dom_removeAttribute(String name) native "Element_removeAttribute_Callback";

  @DomName('Element.removeAttributeNS')
  @DocsEditable
  void $dom_removeAttributeNS(String namespaceURI, String localName) native "Element_removeAttributeNS_Callback";

  @DomName('Element.scrollByLines')
  @DocsEditable
  void scrollByLines(int lines) native "Element_scrollByLines_Callback";

  @DomName('Element.scrollByPages')
  @DocsEditable
  void scrollByPages(int pages) native "Element_scrollByPages_Callback";

  void $dom_scrollIntoView([bool alignWithTop]) {
    if (?alignWithTop) {
      _scrollIntoView_1(alignWithTop);
      return;
    }
    _scrollIntoView_2();
    return;
  }

  @DomName('Element._scrollIntoView_1')
  @DocsEditable
  void _scrollIntoView_1(alignWithTop) native "Element__scrollIntoView_1_Callback";

  @DomName('Element._scrollIntoView_2')
  @DocsEditable
  void _scrollIntoView_2() native "Element__scrollIntoView_2_Callback";

  void $dom_scrollIntoViewIfNeeded([bool centerIfNeeded]) {
    if (?centerIfNeeded) {
      _scrollIntoViewIfNeeded_1(centerIfNeeded);
      return;
    }
    _scrollIntoViewIfNeeded_2();
    return;
  }

  @DomName('Element._scrollIntoViewIfNeeded_1')
  @DocsEditable
  void _scrollIntoViewIfNeeded_1(centerIfNeeded) native "Element__scrollIntoViewIfNeeded_1_Callback";

  @DomName('Element._scrollIntoViewIfNeeded_2')
  @DocsEditable
  void _scrollIntoViewIfNeeded_2() native "Element__scrollIntoViewIfNeeded_2_Callback";

  @DomName('Element.setAttribute')
  @DocsEditable
  void $dom_setAttribute(String name, String value) native "Element_setAttribute_Callback";

  @DomName('Element.setAttributeNS')
  @DocsEditable
  void $dom_setAttributeNS(String namespaceURI, String qualifiedName, String value) native "Element_setAttributeNS_Callback";

  @DomName('Element.webkitCreateShadowRoot')
  @DocsEditable
  @SupportedBrowser(SupportedBrowser.CHROME, '25')
  @Experimental
  ShadowRoot createShadowRoot() native "Element_webkitCreateShadowRoot_Callback";

  @DomName('Element.webkitMatchesSelector')
  @DocsEditable
  @Experimental()
  bool matches(String selectors) native "Element_webkitMatchesSelector_Callback";

  @DomName('Element.webkitRequestFullScreen')
  @DocsEditable
  @SupportedBrowser(SupportedBrowser.CHROME)
  @SupportedBrowser(SupportedBrowser.SAFARI)
  @Experimental
  void requestFullScreen(int flags) native "Element_webkitRequestFullScreen_Callback";

  @DomName('Element.webkitRequestFullscreen')
  @DocsEditable
  @SupportedBrowser(SupportedBrowser.CHROME)
  @SupportedBrowser(SupportedBrowser.SAFARI)
  @Experimental
  void requestFullscreen() native "Element_webkitRequestFullscreen_Callback";

  @DomName('Element.webkitRequestPointerLock')
  @DocsEditable
  @SupportedBrowser(SupportedBrowser.CHROME)
  @SupportedBrowser(SupportedBrowser.SAFARI)
  @Experimental
  void requestPointerLock() native "Element_webkitRequestPointerLock_Callback";

  @DomName('Element.onabort')
  @DocsEditable
  Stream<Event> get onAbort => abortEvent.forTarget(this);

  @DomName('Element.onbeforecopy')
  @DocsEditable
  Stream<Event> get onBeforeCopy => beforeCopyEvent.forTarget(this);

  @DomName('Element.onbeforecut')
  @DocsEditable
  Stream<Event> get onBeforeCut => beforeCutEvent.forTarget(this);

  @DomName('Element.onbeforepaste')
  @DocsEditable
  Stream<Event> get onBeforePaste => beforePasteEvent.forTarget(this);

  @DomName('Element.onblur')
  @DocsEditable
  Stream<Event> get onBlur => blurEvent.forTarget(this);

  @DomName('Element.onchange')
  @DocsEditable
  Stream<Event> get onChange => changeEvent.forTarget(this);

  @DomName('Element.onclick')
  @DocsEditable
  Stream<MouseEvent> get onClick => clickEvent.forTarget(this);

  @DomName('Element.oncontextmenu')
  @DocsEditable
  Stream<MouseEvent> get onContextMenu => contextMenuEvent.forTarget(this);

  @DomName('Element.oncopy')
  @DocsEditable
  Stream<Event> get onCopy => copyEvent.forTarget(this);

  @DomName('Element.oncut')
  @DocsEditable
  Stream<Event> get onCut => cutEvent.forTarget(this);

  @DomName('Element.ondblclick')
  @DocsEditable
  Stream<Event> get onDoubleClick => doubleClickEvent.forTarget(this);

  @DomName('Element.ondrag')
  @DocsEditable
  Stream<MouseEvent> get onDrag => dragEvent.forTarget(this);

  @DomName('Element.ondragend')
  @DocsEditable
  Stream<MouseEvent> get onDragEnd => dragEndEvent.forTarget(this);

  @DomName('Element.ondragenter')
  @DocsEditable
  Stream<MouseEvent> get onDragEnter => dragEnterEvent.forTarget(this);

  @DomName('Element.ondragleave')
  @DocsEditable
  Stream<MouseEvent> get onDragLeave => dragLeaveEvent.forTarget(this);

  @DomName('Element.ondragover')
  @DocsEditable
  Stream<MouseEvent> get onDragOver => dragOverEvent.forTarget(this);

  @DomName('Element.ondragstart')
  @DocsEditable
  Stream<MouseEvent> get onDragStart => dragStartEvent.forTarget(this);

  @DomName('Element.ondrop')
  @DocsEditable
  Stream<MouseEvent> get onDrop => dropEvent.forTarget(this);

  @DomName('Element.onerror')
  @DocsEditable
  Stream<Event> get onError => errorEvent.forTarget(this);

  @DomName('Element.onfocus')
  @DocsEditable
  Stream<Event> get onFocus => focusEvent.forTarget(this);

  @DomName('Element.oninput')
  @DocsEditable
  Stream<Event> get onInput => inputEvent.forTarget(this);

  @DomName('Element.oninvalid')
  @DocsEditable
  Stream<Event> get onInvalid => invalidEvent.forTarget(this);

  @DomName('Element.onkeydown')
  @DocsEditable
  Stream<KeyboardEvent> get onKeyDown => keyDownEvent.forTarget(this);

  @DomName('Element.onkeypress')
  @DocsEditable
  Stream<KeyboardEvent> get onKeyPress => keyPressEvent.forTarget(this);

  @DomName('Element.onkeyup')
  @DocsEditable
  Stream<KeyboardEvent> get onKeyUp => keyUpEvent.forTarget(this);

  @DomName('Element.onload')
  @DocsEditable
  Stream<Event> get onLoad => loadEvent.forTarget(this);

  @DomName('Element.onmousedown')
  @DocsEditable
  Stream<MouseEvent> get onMouseDown => mouseDownEvent.forTarget(this);

  @DomName('Element.onmousemove')
  @DocsEditable
  Stream<MouseEvent> get onMouseMove => mouseMoveEvent.forTarget(this);

  @DomName('Element.onmouseout')
  @DocsEditable
  Stream<MouseEvent> get onMouseOut => mouseOutEvent.forTarget(this);

  @DomName('Element.onmouseover')
  @DocsEditable
  Stream<MouseEvent> get onMouseOver => mouseOverEvent.forTarget(this);

  @DomName('Element.onmouseup')
  @DocsEditable
  Stream<MouseEvent> get onMouseUp => mouseUpEvent.forTarget(this);

  @DomName('Element.onmousewheel')
  @DocsEditable
  Stream<WheelEvent> get onMouseWheel => mouseWheelEvent.forTarget(this);

  @DomName('Element.onpaste')
  @DocsEditable
  Stream<Event> get onPaste => pasteEvent.forTarget(this);

  @DomName('Element.onreset')
  @DocsEditable
  Stream<Event> get onReset => resetEvent.forTarget(this);

  @DomName('Element.onscroll')
  @DocsEditable
  Stream<Event> get onScroll => scrollEvent.forTarget(this);

  @DomName('Element.onsearch')
  @DocsEditable
  Stream<Event> get onSearch => searchEvent.forTarget(this);

  @DomName('Element.onselect')
  @DocsEditable
  Stream<Event> get onSelect => selectEvent.forTarget(this);

  @DomName('Element.onselectstart')
  @DocsEditable
  Stream<Event> get onSelectStart => selectStartEvent.forTarget(this);

  @DomName('Element.onsubmit')
  @DocsEditable
  Stream<Event> get onSubmit => submitEvent.forTarget(this);

  @DomName('Element.ontouchcancel')
  @DocsEditable
  Stream<TouchEvent> get onTouchCancel => touchCancelEvent.forTarget(this);

  @DomName('Element.ontouchend')
  @DocsEditable
  Stream<TouchEvent> get onTouchEnd => touchEndEvent.forTarget(this);

  @DomName('Element.ontouchenter')
  @DocsEditable
  Stream<TouchEvent> get onTouchEnter => touchEnterEvent.forTarget(this);

  @DomName('Element.ontouchleave')
  @DocsEditable
  Stream<TouchEvent> get onTouchLeave => touchLeaveEvent.forTarget(this);

  @DomName('Element.ontouchmove')
  @DocsEditable
  Stream<TouchEvent> get onTouchMove => touchMoveEvent.forTarget(this);

  @DomName('Element.ontouchstart')
  @DocsEditable
  Stream<TouchEvent> get onTouchStart => touchStartEvent.forTarget(this);

  @DomName('Element.onwebkitTransitionEnd')
  @DocsEditable
  @SupportedBrowser(SupportedBrowser.CHROME)
  @SupportedBrowser(SupportedBrowser.FIREFOX)
  @SupportedBrowser(SupportedBrowser.IE, '10')
  @SupportedBrowser(SupportedBrowser.SAFARI)
  Stream<TransitionEvent> get onTransitionEnd => transitionEndEvent.forTarget(this);

  @DomName('Element.onwebkitfullscreenchange')
  @DocsEditable
  Stream<Event> get onFullscreenChange => fullscreenChangeEvent.forTarget(this);

  @DomName('Element.onwebkitfullscreenerror')
  @DocsEditable
  Stream<Event> get onFullscreenError => fullscreenErrorEvent.forTarget(this);

}

final _START_TAG_REGEXP = new RegExp('<(\\w+)');
class _ElementFactoryProvider {
  static const _CUSTOM_PARENT_TAG_MAP = const {
    'body' : 'html',
    'head' : 'html',
    'caption' : 'table',
    'td': 'tr',
    'th': 'tr',
    'colgroup': 'table',
    'col' : 'colgroup',
    'tr' : 'tbody',
    'tbody' : 'table',
    'tfoot' : 'table',
    'thead' : 'table',
    'track' : 'audio',
  };

  // TODO(jmesserly): const set would be better
  static const _TABLE_TAGS = const {
    'caption': null,
    'col': null,
    'colgroup': null,
    'tbody': null,
    'td': null,
    'tfoot': null,
    'th': null,
    'thead': null,
    'tr': null,
  };

  @DomName('Document.createElement')
  static Element createElement_html(String html) {
    // TODO(jacobr): this method can be made more robust and performant.
    // 1) Cache the dummy parent elements required to use innerHTML rather than
    //    creating them every call.
    // 2) Verify that the html does not contain leading or trailing text nodes.
    // 3) Verify that the html does not contain both <head> and <body> tags.
    // 4) Detatch the created element from its dummy parent.
    String parentTag = 'div';
    String tag;
    final match = _START_TAG_REGEXP.firstMatch(html);
    if (match != null) {
      tag = match.group(1).toLowerCase();
      if (Device.isIE && _TABLE_TAGS.containsKey(tag)) {
        return _createTableForIE(html, tag);
      }
      parentTag = _CUSTOM_PARENT_TAG_MAP[tag];
      if (parentTag == null) parentTag = 'div';
    }

    final temp = new Element.tag(parentTag);
    temp.innerHtml = html;

    Element element;
    if (temp.children.length == 1) {
      element = temp.children[0];
    } else if (parentTag == 'html' && temp.children.length == 2) {
      // In html5 the root <html> tag will always have a <body> and a <head>,
      // even though the inner html only contains one of them.
      element = temp.children[tag == 'head' ? 0 : 1];
    } else {
      _singleNode(temp.children);
    }
    element.remove();
    return element;
  }

  /**
   * IE table elements don't support innerHTML (even in standards mode).
   * Instead we use a div and inject the table element in the innerHtml string.
   * This technique works on other browsers too, but it's probably slower,
   * so we only use it when running on IE.
   *
   * See also innerHTML:
   * <http://msdn.microsoft.com/en-us/library/ie/ms533897(v=vs.85).aspx>
   * and Building Tables Dynamically:
   * <http://msdn.microsoft.com/en-us/library/ie/ms532998(v=vs.85).aspx>.
   */
  static Element _createTableForIE(String html, String tag) {
    var div = new Element.tag('div');
    div.innerHtml = '<table>$html</table>';
    var table = _singleNode(div.children);
    Element element;
    switch (tag) {
      case 'td':
      case 'th':
        TableRowElement row = _singleNode(table.rows);
        element = _singleNode(row.cells);
        break;
      case 'tr':
        element = _singleNode(table.rows);
        break;
      case 'tbody':
        element = _singleNode(table.tBodies);
        break;
      case 'thead':
        element = table.tHead;
        break;
      case 'tfoot':
        element = table.tFoot;
        break;
      case 'caption':
        element = table.caption;
        break;
      case 'colgroup':
        element = _getColgroup(table);
        break;
      case 'col':
        element = _singleNode(_getColgroup(table).children);
        break;
    }
    element.remove();
    return element;
  }

  static TableColElement _getColgroup(TableElement table) {
    // TODO(jmesserly): is there a better way to do this?
    return _singleNode(table.children.where((n) => n.tagName == 'COLGROUP')
        .toList());
  }

  static Node _singleNode(List<Node> list) {
    if (list.length == 1) return list[0];
    throw new ArgumentError('HTML had ${list.length} '
        'top level elements but 1 expected');
  }

  @DomName('Document.createElement')
  static Element createElement_tag(String tag) =>
      document.$dom_createElement(tag);
}


/**
 * 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.


@DocsEditable
@DomName('ElementTraversal')
class ElementTraversal extends NativeFieldWrapperClass1 {
  ElementTraversal.internal();

  @DomName('ElementTraversal.childElementCount')
  @DocsEditable
  int get $dom_childElementCount native "ElementTraversal_childElementCount_Getter";

  @DomName('ElementTraversal.firstElementChild')
  @DocsEditable
  Element get $dom_firstElementChild native "ElementTraversal_firstElementChild_Getter";

  @DomName('ElementTraversal.lastElementChild')
  @DocsEditable
  Element get $dom_lastElementChild native "ElementTraversal_lastElementChild_Getter";

  @DomName('ElementTraversal.nextElementSibling')
  @DocsEditable
  Element get nextElementSibling native "ElementTraversal_nextElementSibling_Getter";

  @DomName('ElementTraversal.previousElementSibling')
  @DocsEditable
  Element get previousElementSibling native "ElementTraversal_previousElementSibling_Getter";

}
// 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.


@DocsEditable
@DomName('HTMLEmbedElement')
@SupportedBrowser(SupportedBrowser.CHROME)
@SupportedBrowser(SupportedBrowser.IE)
@SupportedBrowser(SupportedBrowser.SAFARI)
class EmbedElement extends _Element_Merged {
  EmbedElement.internal() : super.internal();

  @DomName('HTMLEmbedElement.HTMLEmbedElement')
  @DocsEditable
  factory EmbedElement() => document.$dom_createElement("embed");

  /// Checks if this type is supported on the current platform.
  static bool get supported => true;

  @DomName('HTMLEmbedElement.align')
  @DocsEditable
  String get align native "HTMLEmbedElement_align_Getter";

  @DomName('HTMLEmbedElement.align')
  @DocsEditable
  void set align(String value) native "HTMLEmbedElement_align_Setter";

  @DomName('HTMLEmbedElement.height')
  @DocsEditable
  String get height native "HTMLEmbedElement_height_Getter";

  @DomName('HTMLEmbedElement.height')
  @DocsEditable
  void set height(String value) native "HTMLEmbedElement_height_Setter";

  @DomName('HTMLEmbedElement.name')
  @DocsEditable
  String get name native "HTMLEmbedElement_name_Getter";

  @DomName('HTMLEmbedElement.name')
  @DocsEditable
  void set name(String value) native "HTMLEmbedElement_name_Setter";

  @DomName('HTMLEmbedElement.src')
  @DocsEditable
  String get src native "HTMLEmbedElement_src_Getter";

  @DomName('HTMLEmbedElement.src')
  @DocsEditable
  void set src(String value) native "HTMLEmbedElement_src_Setter";

  @DomName('HTMLEmbedElement.type')
  @DocsEditable
  String get type native "HTMLEmbedElement_type_Getter";

  @DomName('HTMLEmbedElement.type')
  @DocsEditable
  void set type(String value) native "HTMLEmbedElement_type_Setter";

  @DomName('HTMLEmbedElement.width')
  @DocsEditable
  String get width native "HTMLEmbedElement_width_Getter";

  @DomName('HTMLEmbedElement.width')
  @DocsEditable
  void set width(String value) native "HTMLEmbedElement_width_Setter";

}
// 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.


@DocsEditable
@DomName('EntityReference')
class EntityReference extends Node {
  EntityReference.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.

// WARNING: Do not edit - generated code.


typedef void _EntriesCallback(List<Entry> entries);
// 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.


@DocsEditable
@DomName('Entry')
class Entry extends NativeFieldWrapperClass1 {
  Entry.internal();

  @DomName('Entry.filesystem')
  @DocsEditable
  FileSystem get filesystem native "Entry_filesystem_Getter";

  @DomName('Entry.fullPath')
  @DocsEditable
  String get fullPath native "Entry_fullPath_Getter";

  @DomName('Entry.isDirectory')
  @DocsEditable
  bool get isDirectory native "Entry_isDirectory_Getter";

  @DomName('Entry.isFile')
  @DocsEditable
  bool get isFile native "Entry_isFile_Getter";

  @DomName('Entry.name')
  @DocsEditable
  String get name native "Entry_name_Getter";

  void _copyTo(DirectoryEntry parent, {String name, _EntryCallback successCallback, _ErrorCallback errorCallback}) {
    if (?name) {
      _copyTo_1(parent, name, successCallback, errorCallback);
      return;
    }
    _copyTo_2(parent);
    return;
  }

  @DomName('Entry._copyTo_1')
  @DocsEditable
  void _copyTo_1(parent, name, successCallback, errorCallback) native "Entry__copyTo_1_Callback";

  @DomName('Entry._copyTo_2')
  @DocsEditable
  void _copyTo_2(parent) native "Entry__copyTo_2_Callback";

  Future<Entry> copyTo(DirectoryEntry parent, {String name}) {
    var completer = new Completer<Entry>();
    _copyTo(parent, name : name,
        successCallback : (value) { completer.complete(value); },
        errorCallback : (error) { completer.completeError(error); });
    return completer.future;
  }

  @DomName('Entry.getMetadata')
  @DocsEditable
  void _getMetadata(MetadataCallback successCallback, [_ErrorCallback errorCallback]) native "Entry_getMetadata_Callback";

  Future<Metadata> getMetadata() {
    var completer = new Completer<Metadata>();
    _getMetadata(
        (value) { completer.complete(value); },
        (error) { completer.completeError(error); });
    return completer.future;
  }

  @DomName('Entry.getParent')
  @DocsEditable
  void _getParent([_EntryCallback successCallback, _ErrorCallback errorCallback]) native "Entry_getParent_Callback";

  Future<Entry> getParent() {
    var completer = new Completer<Entry>();
    _getParent(
        (value) { completer.complete(value); },
        (error) { completer.completeError(error); });
    return completer.future;
  }

  void _moveTo(DirectoryEntry parent, {String name, _EntryCallback successCallback, _ErrorCallback errorCallback}) {
    if (?name) {
      _moveTo_1(parent, name, successCallback, errorCallback);
      return;
    }
    _moveTo_2(parent);
    return;
  }

  @DomName('Entry._moveTo_1')
  @DocsEditable
  void _moveTo_1(parent, name, successCallback, errorCallback) native "Entry__moveTo_1_Callback";

  @DomName('Entry._moveTo_2')
  @DocsEditable
  void _moveTo_2(parent) native "Entry__moveTo_2_Callback";

  Future<Entry> moveTo(DirectoryEntry parent, {String name}) {
    var completer = new Completer<Entry>();
    _moveTo(parent, name : name,
        successCallback : (value) { completer.complete(value); },
        errorCallback : (error) { completer.completeError(error); });
    return completer.future;
  }

  @DomName('Entry.remove')
  @DocsEditable
  void _remove(VoidCallback successCallback, [_ErrorCallback errorCallback]) native "Entry_remove_Callback";

  Future remove() {
    var completer = new Completer();
    _remove(
        () { completer.complete(); },
        (error) { completer.completeError(error); });
    return completer.future;
  }

  @DomName('Entry.toURL')
  @DocsEditable
  String toUrl() native "Entry_toURL_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


typedef void _EntryCallback(Entry entry);
// 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.


@DocsEditable
@DomName('EntrySync')
class EntrySync extends NativeFieldWrapperClass1 {
  EntrySync.internal();

  @DomName('EntrySync.filesystem')
  @DocsEditable
  FileSystemSync get filesystem native "EntrySync_filesystem_Getter";

  @DomName('EntrySync.fullPath')
  @DocsEditable
  String get fullPath native "EntrySync_fullPath_Getter";

  @DomName('EntrySync.isDirectory')
  @DocsEditable
  bool get isDirectory native "EntrySync_isDirectory_Getter";

  @DomName('EntrySync.isFile')
  @DocsEditable
  bool get isFile native "EntrySync_isFile_Getter";

  @DomName('EntrySync.name')
  @DocsEditable
  String get name native "EntrySync_name_Getter";

  @DomName('EntrySync.copyTo')
  @DocsEditable
  EntrySync copyTo(DirectoryEntrySync parent, String name) native "EntrySync_copyTo_Callback";

  @DomName('EntrySync.getMetadata')
  @DocsEditable
  Metadata getMetadata() native "EntrySync_getMetadata_Callback";

  @DomName('EntrySync.getParent')
  @DocsEditable
  EntrySync getParent() native "EntrySync_getParent_Callback";

  @DomName('EntrySync.moveTo')
  @DocsEditable
  EntrySync moveTo(DirectoryEntrySync parent, String name) native "EntrySync_moveTo_Callback";

  @DomName('EntrySync.remove')
  @DocsEditable
  void remove() native "EntrySync_remove_Callback";

  @DomName('EntrySync.toURL')
  @DocsEditable
  String toUrl() native "EntrySync_toURL_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


typedef void _ErrorCallback(FileError error);
// 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.


@DocsEditable
@DomName('ErrorEvent')
class ErrorEvent extends Event {
  ErrorEvent.internal() : super.internal();

  @DomName('ErrorEvent.filename')
  @DocsEditable
  String get filename native "ErrorEvent_filename_Getter";

  @DomName('ErrorEvent.lineno')
  @DocsEditable
  int get lineno native "ErrorEvent_lineno_Getter";

  @DomName('ErrorEvent.message')
  @DocsEditable
  String get message native "ErrorEvent_message_Getter";

}
// 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')
class Event extends NativeFieldWrapperClass1 {
  // 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: canBubble);
  }

  /**
   * 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.$dom_createEvent(type);
    e.$dom_initEvent(name, canBubble, cancelable);
    return e;
  }
  Event.internal();

  static const int AT_TARGET = 2;

  static const int BLUR = 8192;

  static const int BUBBLING_PHASE = 3;

  static const int CAPTURING_PHASE = 1;

  static const int CHANGE = 32768;

  static const int CLICK = 64;

  static const int DBLCLICK = 128;

  static const int DRAGDROP = 2048;

  static const int FOCUS = 4096;

  static const int KEYDOWN = 256;

  static const int KEYPRESS = 1024;

  static const int KEYUP = 512;

  static const int MOUSEDOWN = 1;

  static const int MOUSEDRAG = 32;

  static const int MOUSEMOVE = 16;

  static const int MOUSEOUT = 8;

  static const int MOUSEOVER = 4;

  static const int MOUSEUP = 2;

  static const int NONE = 0;

  static const int SELECT = 16384;

  @DomName('Event.bubbles')
  @DocsEditable
  bool get bubbles native "Event_bubbles_Getter";

  @DomName('Event.cancelBubble')
  @DocsEditable
  bool get cancelBubble native "Event_cancelBubble_Getter";

  @DomName('Event.cancelBubble')
  @DocsEditable
  void set cancelBubble(bool value) native "Event_cancelBubble_Setter";

  @DomName('Event.cancelable')
  @DocsEditable
  bool get cancelable native "Event_cancelable_Getter";

  @DomName('Event.clipboardData')
  @DocsEditable
  DataTransfer get clipboardData native "Event_clipboardData_Getter";

  @DomName('Event.currentTarget')
  @DocsEditable
  EventTarget get currentTarget native "Event_currentTarget_Getter";

  @DomName('Event.defaultPrevented')
  @DocsEditable
  bool get defaultPrevented native "Event_defaultPrevented_Getter";

  @DomName('Event.eventPhase')
  @DocsEditable
  int get eventPhase native "Event_eventPhase_Getter";

  @DomName('Event.returnValue')
  @DocsEditable
  bool get returnValue native "Event_returnValue_Getter";

  @DomName('Event.returnValue')
  @DocsEditable
  void set returnValue(bool value) native "Event_returnValue_Setter";

  @DomName('Event.target')
  @DocsEditable
  EventTarget get target native "Event_target_Getter";

  @DomName('Event.timeStamp')
  @DocsEditable
  int get timeStamp native "Event_timeStamp_Getter";

  @DomName('Event.type')
  @DocsEditable
  String get type native "Event_type_Getter";

  @DomName('Event.initEvent')
  @DocsEditable
  void $dom_initEvent(String eventTypeArg, bool canBubbleArg, bool cancelableArg) native "Event_initEvent_Callback";

  @DomName('Event.preventDefault')
  @DocsEditable
  void preventDefault() native "Event_preventDefault_Callback";

  @DomName('Event.stopImmediatePropagation')
  @DocsEditable
  void stopImmediatePropagation() native "Event_stopImmediatePropagation_Callback";

  @DomName('Event.stopPropagation')
  @DocsEditable
  void stopPropagation() native "Event_stopPropagation_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('EventException')
class EventException extends NativeFieldWrapperClass1 {
  EventException.internal();

  static const int DISPATCH_REQUEST_ERR = 1;

  static const int UNSPECIFIED_EVENT_TYPE_ERR = 0;

  @DomName('EventException.code')
  @DocsEditable
  int get code native "EventException_code_Getter";

  @DomName('EventException.message')
  @DocsEditable
  String get message native "EventException_message_Getter";

  @DomName('EventException.name')
  @DocsEditable
  String get name native "EventException_name_Getter";

  @DomName('EventException.toString')
  @DocsEditable
  String toString() native "EventException_toString_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('EventSource')
class EventSource extends EventTarget {
  EventSource.internal() : super.internal();

  @DomName('EventSource.errorEvent')
  @DocsEditable
  static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');

  @DomName('EventSource.messageEvent')
  @DocsEditable
  static const EventStreamProvider<MessageEvent> messageEvent = const EventStreamProvider<MessageEvent>('message');

  @DomName('EventSource.openEvent')
  @DocsEditable
  static const EventStreamProvider<Event> openEvent = const EventStreamProvider<Event>('open');

  @DomName('EventSource.EventSource')
  @DocsEditable
  factory EventSource(String url, [Map eventSourceInit]) {
    return EventSource._create_1(url, eventSourceInit);
  }

  @DocsEditable
  static EventSource _create_1(url, eventSourceInit) native "EventSource__create_1constructorCallback";

  static const int CLOSED = 2;

  static const int CONNECTING = 0;

  static const int OPEN = 1;

  @DomName('EventSource.readyState')
  @DocsEditable
  int get readyState native "EventSource_readyState_Getter";

  @DomName('EventSource.url')
  @DocsEditable
  String get url native "EventSource_url_Getter";

  @DomName('EventSource.withCredentials')
  @DocsEditable
  bool get withCredentials native "EventSource_withCredentials_Getter";

  @DomName('EventSource.addEventListener')
  @DocsEditable
  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "EventSource_addEventListener_Callback";

  @DomName('EventSource.close')
  @DocsEditable
  void close() native "EventSource_close_Callback";

  @DomName('EventSource.dispatchEvent')
  @DocsEditable
  bool dispatchEvent(Event evt) native "EventSource_dispatchEvent_Callback";

  @DomName('EventSource.removeEventListener')
  @DocsEditable
  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "EventSource_removeEventListener_Callback";

  @DomName('EventSource.onerror')
  @DocsEditable
  Stream<Event> get onError => errorEvent.forTarget(this);

  @DomName('EventSource.onmessage')
  @DocsEditable
  Stream<MessageEvent> get onMessage => messageEvent.forTarget(this);

  @DomName('EventSource.onopen')
  @DocsEditable
  Stream<Event> get onOpen => openEvent.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.


/**
 * 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);
  }
}

/**
 * Base class for all browser objects that support events.
 *
 * Use the [on] property to add, and remove events (rather than
 * [$dom_addEventListener] and [$dom_removeEventListener]
 * for compile-time type checks and a more concise API.
 */
@DomName('EventTarget')
class EventTarget extends NativeFieldWrapperClass1 {

  /**
   * 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);
  EventTarget.internal();

  @DomName('EventTarget.addEventListener')
  @DocsEditable
  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "EventTarget_addEventListener_Callback";

  @DomName('EventTarget.dispatchEvent')
  @DocsEditable
  bool dispatchEvent(Event event) native "EventTarget_dispatchEvent_Callback";

  @DomName('EventTarget.removeEventListener')
  @DocsEditable
  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "EventTarget_removeEventListener_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('EXTDrawBuffers')
class ExtDrawBuffers extends NativeFieldWrapperClass1 {
  ExtDrawBuffers.internal();

  static const int COLOR_ATTACHMENT0_EXT = 0x8CE0;

  static const int COLOR_ATTACHMENT10_EXT = 0x8CEA;

  static const int COLOR_ATTACHMENT11_EXT = 0x8CEB;

  static const int COLOR_ATTACHMENT12_EXT = 0x8CEC;

  static const int COLOR_ATTACHMENT13_EXT = 0x8CED;

  static const int COLOR_ATTACHMENT14_EXT = 0x8CEE;

  static const int COLOR_ATTACHMENT15_EXT = 0x8CEF;

  static const int COLOR_ATTACHMENT1_EXT = 0x8CE1;

  static const int COLOR_ATTACHMENT2_EXT = 0x8CE2;

  static const int COLOR_ATTACHMENT3_EXT = 0x8CE3;

  static const int COLOR_ATTACHMENT4_EXT = 0x8CE4;

  static const int COLOR_ATTACHMENT5_EXT = 0x8CE5;

  static const int COLOR_ATTACHMENT6_EXT = 0x8CE6;

  static const int COLOR_ATTACHMENT7_EXT = 0x8CE7;

  static const int COLOR_ATTACHMENT8_EXT = 0x8CE8;

  static const int COLOR_ATTACHMENT9_EXT = 0x8CE9;

  static const int DRAW_BUFFER0_EXT = 0x8825;

  static const int DRAW_BUFFER10_EXT = 0x882F;

  static const int DRAW_BUFFER11_EXT = 0x8830;

  static const int DRAW_BUFFER12_EXT = 0x8831;

  static const int DRAW_BUFFER13_EXT = 0x8832;

  static const int DRAW_BUFFER14_EXT = 0x8833;

  static const int DRAW_BUFFER15_EXT = 0x8834;

  static const int DRAW_BUFFER1_EXT = 0x8826;

  static const int DRAW_BUFFER2_EXT = 0x8827;

  static const int DRAW_BUFFER3_EXT = 0x8828;

  static const int DRAW_BUFFER4_EXT = 0x8829;

  static const int DRAW_BUFFER5_EXT = 0x882A;

  static const int DRAW_BUFFER6_EXT = 0x882B;

  static const int DRAW_BUFFER7_EXT = 0x882C;

  static const int DRAW_BUFFER8_EXT = 0x882D;

  static const int DRAW_BUFFER9_EXT = 0x882E;

  static const int MAX_COLOR_ATTACHMENTS_EXT = 0x8CDF;

  static const int MAX_DRAW_BUFFERS_EXT = 0x8824;

}
// 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.


@DocsEditable
@DomName('EXTTextureFilterAnisotropic')
class ExtTextureFilterAnisotropic extends NativeFieldWrapperClass1 {
  ExtTextureFilterAnisotropic.internal();

  static const int MAX_TEXTURE_MAX_ANISOTROPY_EXT = 0x84FF;

  static const int TEXTURE_MAX_ANISOTROPY_EXT = 0x84FE;

}
// 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.


@DocsEditable
@DomName('HTMLFieldSetElement')
class FieldSetElement extends _Element_Merged {
  FieldSetElement.internal() : super.internal();

  @DomName('HTMLFieldSetElement.HTMLFieldSetElement')
  @DocsEditable
  factory FieldSetElement() => document.$dom_createElement("fieldset");

  @DomName('HTMLFieldSetElement.disabled')
  @DocsEditable
  bool get disabled native "HTMLFieldSetElement_disabled_Getter";

  @DomName('HTMLFieldSetElement.disabled')
  @DocsEditable
  void set disabled(bool value) native "HTMLFieldSetElement_disabled_Setter";

  @DomName('HTMLFieldSetElement.elements')
  @DocsEditable
  HtmlCollection get elements native "HTMLFieldSetElement_elements_Getter";

  @DomName('HTMLFieldSetElement.form')
  @DocsEditable
  FormElement get form native "HTMLFieldSetElement_form_Getter";

  @DomName('HTMLFieldSetElement.name')
  @DocsEditable
  String get name native "HTMLFieldSetElement_name_Getter";

  @DomName('HTMLFieldSetElement.name')
  @DocsEditable
  void set name(String value) native "HTMLFieldSetElement_name_Setter";

  @DomName('HTMLFieldSetElement.type')
  @DocsEditable
  String get type native "HTMLFieldSetElement_type_Getter";

  @DomName('HTMLFieldSetElement.validationMessage')
  @DocsEditable
  String get validationMessage native "HTMLFieldSetElement_validationMessage_Getter";

  @DomName('HTMLFieldSetElement.validity')
  @DocsEditable
  ValidityState get validity native "HTMLFieldSetElement_validity_Getter";

  @DomName('HTMLFieldSetElement.willValidate')
  @DocsEditable
  bool get willValidate native "HTMLFieldSetElement_willValidate_Getter";

  @DomName('HTMLFieldSetElement.checkValidity')
  @DocsEditable
  bool checkValidity() native "HTMLFieldSetElement_checkValidity_Callback";

  @DomName('HTMLFieldSetElement.setCustomValidity')
  @DocsEditable
  void setCustomValidity(String error) native "HTMLFieldSetElement_setCustomValidity_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('File')
class File extends Blob {
  File.internal() : super.internal();

  @DomName('File.lastModifiedDate')
  @DocsEditable
  DateTime get lastModifiedDate native "File_lastModifiedDate_Getter";

  @DomName('File.name')
  @DocsEditable
  String get name native "File_name_Getter";

  @DomName('File.webkitRelativePath')
  @DocsEditable
  @SupportedBrowser(SupportedBrowser.CHROME)
  @SupportedBrowser(SupportedBrowser.SAFARI)
  @Experimental
  String get relativePath native "File_webkitRelativePath_Getter";

}
// 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.


typedef void _FileCallback(File file);
// 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.


@DocsEditable
@DomName('FileEntry')
class FileEntry extends Entry {
  FileEntry.internal() : super.internal();

  @DomName('FileEntry.createWriter')
  @DocsEditable
  void _createWriter(_FileWriterCallback successCallback, [_ErrorCallback errorCallback]) native "FileEntry_createWriter_Callback";

  Future<FileWriter> createWriter() {
    var completer = new Completer<FileWriter>();
    _createWriter(
        (value) { completer.complete(value); },
        (error) { completer.completeError(error); });
    return completer.future;
  }

  @DomName('FileEntry.file')
  @DocsEditable
  void _file(_FileCallback successCallback, [_ErrorCallback errorCallback]) native "FileEntry_file_Callback";

  Future<File> file() {
    var completer = new Completer<File>();
    _file(
        (value) { completer.complete(value); },
        (error) { completer.completeError(error); });
    return completer.future;
  }

}
// 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.


@DocsEditable
@DomName('FileEntrySync')
class FileEntrySync extends EntrySync {
  FileEntrySync.internal() : super.internal();

  @DomName('FileEntrySync.createWriter')
  @DocsEditable
  FileWriterSync createWriter() native "FileEntrySync_createWriter_Callback";

  @DomName('FileEntrySync.file')
  @DocsEditable
  File file() native "FileEntrySync_file_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('FileError')
class FileError extends NativeFieldWrapperClass1 {
  FileError.internal();

  static const int ABORT_ERR = 3;

  static const int ENCODING_ERR = 5;

  static const int INVALID_MODIFICATION_ERR = 9;

  static const int INVALID_STATE_ERR = 7;

  static const int NOT_FOUND_ERR = 1;

  static const int NOT_READABLE_ERR = 4;

  static const int NO_MODIFICATION_ALLOWED_ERR = 6;

  static const int PATH_EXISTS_ERR = 12;

  static const int QUOTA_EXCEEDED_ERR = 10;

  static const int SECURITY_ERR = 2;

  static const int SYNTAX_ERR = 8;

  static const int TYPE_MISMATCH_ERR = 11;

  @DomName('FileError.code')
  @DocsEditable
  int get code native "FileError_code_Getter";

}
// 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.


@DocsEditable
@DomName('FileException')
class FileException extends NativeFieldWrapperClass1 {
  FileException.internal();

  static const int ABORT_ERR = 3;

  static const int ENCODING_ERR = 5;

  static const int INVALID_MODIFICATION_ERR = 9;

  static const int INVALID_STATE_ERR = 7;

  static const int NOT_FOUND_ERR = 1;

  static const int NOT_READABLE_ERR = 4;

  static const int NO_MODIFICATION_ALLOWED_ERR = 6;

  static const int PATH_EXISTS_ERR = 12;

  static const int QUOTA_EXCEEDED_ERR = 10;

  static const int SECURITY_ERR = 2;

  static const int SYNTAX_ERR = 8;

  static const int TYPE_MISMATCH_ERR = 11;

  @DomName('FileException.code')
  @DocsEditable
  int get code native "FileException_code_Getter";

  @DomName('FileException.message')
  @DocsEditable
  String get message native "FileException_message_Getter";

  @DomName('FileException.name')
  @DocsEditable
  String get name native "FileException_name_Getter";

  @DomName('FileException.toString')
  @DocsEditable
  String toString() native "FileException_toString_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('FileList')
class FileList extends NativeFieldWrapperClass1 implements List<File> {
  FileList.internal();

  @DomName('FileList.length')
  @DocsEditable
  int get length native "FileList_length_Getter";

  File operator[](int index) native "FileList_item_Callback";

  void operator[]=(int index, File value) {
    throw new UnsupportedError("Cannot assign element of immutable List.");
  }
  // -- start List<File> mixins.
  // File is the element type.

  // From Iterable<File>:

  Iterator<File> 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<File>(this);
  }

  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, File)) {
    return IterableMixinWorkaround.reduce(this, initialValue, combine);
  }

  bool contains(File element) => IterableMixinWorkaround.contains(this, element);

  void forEach(void f(File element)) => IterableMixinWorkaround.forEach(this, f);

  String join([String separator]) =>
      IterableMixinWorkaround.joinList(this, separator);

  Iterable map(f(File element)) =>
      IterableMixinWorkaround.mapList(this, f);

  Iterable<File> where(bool f(File element)) =>
      IterableMixinWorkaround.where(this, f);

  Iterable expand(Iterable f(File element)) =>
      IterableMixinWorkaround.expand(this, f);

  bool every(bool f(File element)) => IterableMixinWorkaround.every(this, f);

  bool any(bool f(File element)) => IterableMixinWorkaround.any(this, f);

  List<File> toList({ bool growable: true }) =>
      new List<File>.from(this, growable: growable);

  Set<File> toSet() => new Set<File>.from(this);

  bool get isEmpty => this.length == 0;

  Iterable<File> take(int n) => IterableMixinWorkaround.takeList(this, n);

  Iterable<File> takeWhile(bool test(File value)) {
    return IterableMixinWorkaround.takeWhile(this, test);
  }

  Iterable<File> skip(int n) => IterableMixinWorkaround.skipList(this, n);

  Iterable<File> skipWhile(bool test(File value)) {
    return IterableMixinWorkaround.skipWhile(this, test);
  }

  File firstWhere(bool test(File value), { File orElse() }) {
    return IterableMixinWorkaround.firstWhere(this, test, orElse);
  }

  File lastWhere(bool test(File value), {File orElse()}) {
    return IterableMixinWorkaround.lastWhereList(this, test, orElse);
  }

  File singleWhere(bool test(File value)) {
    return IterableMixinWorkaround.singleWhere(this, test);
  }

  File elementAt(int index) {
    return this[index];
  }

  // From Collection<File>:

  void add(File value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(File value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Iterable<File> iterable) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  // From List<File>:
  void set length(int value) {
    throw new UnsupportedError("Cannot resize immutable List.");
  }

  void clear() {
    throw new UnsupportedError("Cannot clear immutable List.");
  }

  Iterable<File> get reversed {
    return IterableMixinWorkaround.reversedList(this);
  }

  void sort([int compare(File a, File b)]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(File element, [int start = 0]) =>
      Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(File element, [int start]) {
    if (start == null) start = length - 1;
    return Lists.lastIndexOf(this, element, start);
  }

  File get first {
    if (this.length > 0) return this[0];
    throw new StateError("No elements");
  }

  File get last {
    if (this.length > 0) return this[this.length - 1];
    throw new StateError("No elements");
  }

  File get single {
    if (length == 1) return this[0];
    if (length == 0) throw new StateError("No elements");
    throw new StateError("More than one element");
  }

  File min([int compare(File a, File b)]) =>
      IterableMixinWorkaround.min(this, compare);

  File max([int compare(File a, File b)]) =>
      IterableMixinWorkaround.max(this, compare);

  void insert(int index, File element) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  File removeAt(int pos) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  File removeLast() {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void remove(Object object) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void removeAll(Iterable elements) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void retainAll(Iterable elements) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void removeWhere(bool test(File element)) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void retainWhere(bool test(File element)) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void setRange(int start, int rangeLength, List<File> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [File initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<File> sublist(int start, [int end]) {
    if (end == null) end = length;
    return Lists.getRange(this, start, end, <File>[]);
  }

  List<File> getRange(int start, int rangeLength) =>
      sublist(start, start + rangeLength);

  Map<int, File> asMap() =>
    IterableMixinWorkaround.asMapList(this);

  // -- end List<File> mixins.

  @DomName('FileList.item')
  @DocsEditable
  File item(int index) native "FileList_item_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('FileReader')
class FileReader extends EventTarget {
  FileReader.internal() : super.internal();

  @DomName('FileReader.abortEvent')
  @DocsEditable
  static const EventStreamProvider<ProgressEvent> abortEvent = const EventStreamProvider<ProgressEvent>('abort');

  @DomName('FileReader.errorEvent')
  @DocsEditable
  static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');

  @DomName('FileReader.loadEvent')
  @DocsEditable
  static const EventStreamProvider<ProgressEvent> loadEvent = const EventStreamProvider<ProgressEvent>('load');

  @DomName('FileReader.loadendEvent')
  @DocsEditable
  static const EventStreamProvider<ProgressEvent> loadEndEvent = const EventStreamProvider<ProgressEvent>('loadend');

  @DomName('FileReader.loadstartEvent')
  @DocsEditable
  static const EventStreamProvider<ProgressEvent> loadStartEvent = const EventStreamProvider<ProgressEvent>('loadstart');

  @DomName('FileReader.progressEvent')
  @DocsEditable
  static const EventStreamProvider<ProgressEvent> progressEvent = const EventStreamProvider<ProgressEvent>('progress');

  @DomName('FileReader.FileReader')
  @DocsEditable
  factory FileReader() {
    return FileReader._create_1();
  }

  @DocsEditable
  static FileReader _create_1() native "FileReader__create_1constructorCallback";

  static const int DONE = 2;

  static const int EMPTY = 0;

  static const int LOADING = 1;

  @DomName('FileReader.error')
  @DocsEditable
  FileError get error native "FileReader_error_Getter";

  @DomName('FileReader.readyState')
  @DocsEditable
  int get readyState native "FileReader_readyState_Getter";

  @DomName('FileReader.result')
  @DocsEditable
  Object get result native "FileReader_result_Getter";

  @DomName('FileReader.abort')
  @DocsEditable
  void abort() native "FileReader_abort_Callback";

  @DomName('FileReader.addEventListener')
  @DocsEditable
  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "FileReader_addEventListener_Callback";

  @DomName('FileReader.dispatchEvent')
  @DocsEditable
  bool dispatchEvent(Event evt) native "FileReader_dispatchEvent_Callback";

  @DomName('FileReader.readAsArrayBuffer')
  @DocsEditable
  void readAsArrayBuffer(Blob blob) native "FileReader_readAsArrayBuffer_Callback";

  @DomName('FileReader.readAsBinaryString')
  @DocsEditable
  void readAsBinaryString(Blob blob) native "FileReader_readAsBinaryString_Callback";

  @DomName('FileReader.readAsDataURL')
  @DocsEditable
  void readAsDataUrl(Blob blob) native "FileReader_readAsDataURL_Callback";

  void readAsText(Blob blob, [String encoding]) {
    if (?encoding) {
      _readAsText_1(blob, encoding);
      return;
    }
    _readAsText_2(blob);
    return;
  }

  @DomName('FileReader._readAsText_1')
  @DocsEditable
  void _readAsText_1(blob, encoding) native "FileReader__readAsText_1_Callback";

  @DomName('FileReader._readAsText_2')
  @DocsEditable
  void _readAsText_2(blob) native "FileReader__readAsText_2_Callback";

  @DomName('FileReader.removeEventListener')
  @DocsEditable
  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "FileReader_removeEventListener_Callback";

  @DomName('FileReader.onabort')
  @DocsEditable
  Stream<ProgressEvent> get onAbort => abortEvent.forTarget(this);

  @DomName('FileReader.onerror')
  @DocsEditable
  Stream<Event> get onError => errorEvent.forTarget(this);

  @DomName('FileReader.onload')
  @DocsEditable
  Stream<ProgressEvent> get onLoad => loadEvent.forTarget(this);

  @DomName('FileReader.onloadend')
  @DocsEditable
  Stream<ProgressEvent> get onLoadEnd => loadEndEvent.forTarget(this);

  @DomName('FileReader.onloadstart')
  @DocsEditable
  Stream<ProgressEvent> get onLoadStart => loadStartEvent.forTarget(this);

  @DomName('FileReader.onprogress')
  @DocsEditable
  Stream<ProgressEvent> get onProgress => progressEvent.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.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('FileReaderSync')
class FileReaderSync extends NativeFieldWrapperClass1 {
  FileReaderSync.internal();

  @DomName('FileReaderSync.FileReaderSync')
  @DocsEditable
  factory FileReaderSync() {
    return FileReaderSync._create_1();
  }

  @DocsEditable
  static FileReaderSync _create_1() native "FileReaderSync__create_1constructorCallback";

  @DomName('FileReaderSync.readAsArrayBuffer')
  @DocsEditable
  dynamic readAsArrayBuffer(Blob blob) native "FileReaderSync_readAsArrayBuffer_Callback";

  @DomName('FileReaderSync.readAsBinaryString')
  @DocsEditable
  String readAsBinaryString(Blob blob) native "FileReaderSync_readAsBinaryString_Callback";

  @DomName('FileReaderSync.readAsDataURL')
  @DocsEditable
  String readAsDataUrl(Blob blob) native "FileReaderSync_readAsDataURL_Callback";

  String readAsText(Blob blob, [String encoding]) {
    if (?encoding) {
      return _readAsText_1(blob, encoding);
    }
    return _readAsText_2(blob);
  }

  @DomName('FileReaderSync._readAsText_1')
  @DocsEditable
  String _readAsText_1(blob, encoding) native "FileReaderSync__readAsText_1_Callback";

  @DomName('FileReaderSync._readAsText_2')
  @DocsEditable
  String _readAsText_2(blob) native "FileReaderSync__readAsText_2_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('DOMFileSystem')
@SupportedBrowser(SupportedBrowser.CHROME)
@Experimental
class FileSystem extends NativeFieldWrapperClass1 {
  FileSystem.internal();

  /// Checks if this type is supported on the current platform.
  static bool get supported => true;

  @DomName('DOMFileSystem.name')
  @DocsEditable
  String get name native "DOMFileSystem_name_Getter";

  @DomName('DOMFileSystem.root')
  @DocsEditable
  DirectoryEntry get root native "DOMFileSystem_root_Getter";

}
// 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.


typedef void _FileSystemCallback(FileSystem fileSystem);
// 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.


@DocsEditable
@DomName('DOMFileSystemSync')
@SupportedBrowser(SupportedBrowser.CHROME)
@Experimental
class FileSystemSync extends NativeFieldWrapperClass1 {
  FileSystemSync.internal();

  @DomName('DOMFileSystemSync.name')
  @DocsEditable
  String get name native "DOMFileSystemSync_name_Getter";

  @DomName('DOMFileSystemSync.root')
  @DocsEditable
  DirectoryEntrySync get root native "DOMFileSystemSync_root_Getter";

}
// 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.


@DocsEditable
@DomName('FileWriter')
class FileWriter extends EventTarget {
  FileWriter.internal() : super.internal();

  @DomName('FileWriter.abortEvent')
  @DocsEditable
  static const EventStreamProvider<ProgressEvent> abortEvent = const EventStreamProvider<ProgressEvent>('abort');

  @DomName('FileWriter.errorEvent')
  @DocsEditable
  static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');

  @DomName('FileWriter.progressEvent')
  @DocsEditable
  static const EventStreamProvider<ProgressEvent> progressEvent = const EventStreamProvider<ProgressEvent>('progress');

  @DomName('FileWriter.writeEvent')
  @DocsEditable
  static const EventStreamProvider<ProgressEvent> writeEvent = const EventStreamProvider<ProgressEvent>('write');

  @DomName('FileWriter.writeendEvent')
  @DocsEditable
  static const EventStreamProvider<ProgressEvent> writeEndEvent = const EventStreamProvider<ProgressEvent>('writeend');

  @DomName('FileWriter.writestartEvent')
  @DocsEditable
  static const EventStreamProvider<ProgressEvent> writeStartEvent = const EventStreamProvider<ProgressEvent>('writestart');

  static const int DONE = 2;

  static const int INIT = 0;

  static const int WRITING = 1;

  @DomName('FileWriter.error')
  @DocsEditable
  FileError get error native "FileWriter_error_Getter";

  @DomName('FileWriter.length')
  @DocsEditable
  int get length native "FileWriter_length_Getter";

  @DomName('FileWriter.position')
  @DocsEditable
  int get position native "FileWriter_position_Getter";

  @DomName('FileWriter.readyState')
  @DocsEditable
  int get readyState native "FileWriter_readyState_Getter";

  @DomName('FileWriter.abort')
  @DocsEditable
  void abort() native "FileWriter_abort_Callback";

  @DomName('FileWriter.addEventListener')
  @DocsEditable
  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "FileWriter_addEventListener_Callback";

  @DomName('FileWriter.dispatchEvent')
  @DocsEditable
  bool dispatchEvent(Event evt) native "FileWriter_dispatchEvent_Callback";

  @DomName('FileWriter.removeEventListener')
  @DocsEditable
  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "FileWriter_removeEventListener_Callback";

  @DomName('FileWriter.seek')
  @DocsEditable
  void seek(int position) native "FileWriter_seek_Callback";

  @DomName('FileWriter.truncate')
  @DocsEditable
  void truncate(int size) native "FileWriter_truncate_Callback";

  @DomName('FileWriter.write')
  @DocsEditable
  void write(Blob data) native "FileWriter_write_Callback";

  @DomName('FileWriter.onabort')
  @DocsEditable
  Stream<ProgressEvent> get onAbort => abortEvent.forTarget(this);

  @DomName('FileWriter.onerror')
  @DocsEditable
  Stream<Event> get onError => errorEvent.forTarget(this);

  @DomName('FileWriter.onprogress')
  @DocsEditable
  Stream<ProgressEvent> get onProgress => progressEvent.forTarget(this);

  @DomName('FileWriter.onwrite')
  @DocsEditable
  Stream<ProgressEvent> get onWrite => writeEvent.forTarget(this);

  @DomName('FileWriter.onwriteend')
  @DocsEditable
  Stream<ProgressEvent> get onWriteEnd => writeEndEvent.forTarget(this);

  @DomName('FileWriter.onwritestart')
  @DocsEditable
  Stream<ProgressEvent> get onWriteStart => writeStartEvent.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.

// WARNING: Do not edit - generated code.


typedef void _FileWriterCallback(FileWriter fileWriter);
// 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.


@DocsEditable
@DomName('FileWriterSync')
class FileWriterSync extends NativeFieldWrapperClass1 {
  FileWriterSync.internal();

  @DomName('FileWriterSync.length')
  @DocsEditable
  int get length native "FileWriterSync_length_Getter";

  @DomName('FileWriterSync.position')
  @DocsEditable
  int get position native "FileWriterSync_position_Getter";

  @DomName('FileWriterSync.seek')
  @DocsEditable
  void seek(int position) native "FileWriterSync_seek_Callback";

  @DomName('FileWriterSync.truncate')
  @DocsEditable
  void truncate(int size) native "FileWriterSync_truncate_Callback";

  @DomName('FileWriterSync.write')
  @DocsEditable
  void write(Blob data) native "FileWriterSync_write_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('Float32Array')
class Float32Array extends ArrayBufferView implements List<double> {
  Float32Array.internal() : super.internal();

  @DomName('Float32Array.Float32Array')
  @DocsEditable
  factory Float32Array(int length) =>
    _TypedArrayFactoryProvider.createFloat32Array(length);

  @DomName('Float32Array.fromList')
  @DocsEditable
  factory Float32Array.fromList(List<num> list) =>
    _TypedArrayFactoryProvider.createFloat32Array_fromList(list);

  @DomName('Float32Array.fromBuffer')
  @DocsEditable
  factory Float32Array.fromBuffer(ArrayBuffer buffer, [int byteOffset, int length]) => 
    _TypedArrayFactoryProvider.createFloat32Array_fromBuffer(buffer, byteOffset, length);

  static const int BYTES_PER_ELEMENT = 4;

  @DomName('Float32Array.length')
  @DocsEditable
  int get length native "Float32Array_length_Getter";

  @DomName('Float32Array.numericIndexGetter')
  @DocsEditable
  num operator[](int index) native "Float32Array_numericIndexGetter_Callback";

  @DomName('Float32Array.numericIndexSetter')
  @DocsEditable
  void operator[]=(int index, num value) native "Float32Array_numericIndexSetter_Callback";
  // -- start List<num> mixins.
  // num is the element type.

  // From Iterable<num>:

  Iterator<num> 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<num>(this);
  }

  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, num)) {
    return IterableMixinWorkaround.reduce(this, initialValue, combine);
  }

  bool contains(num element) => IterableMixinWorkaround.contains(this, element);

  void forEach(void f(num element)) => IterableMixinWorkaround.forEach(this, f);

  String join([String separator]) =>
      IterableMixinWorkaround.joinList(this, separator);

  Iterable map(f(num element)) =>
      IterableMixinWorkaround.mapList(this, f);

  Iterable<num> where(bool f(num element)) =>
      IterableMixinWorkaround.where(this, f);

  Iterable expand(Iterable f(num element)) =>
      IterableMixinWorkaround.expand(this, f);

  bool every(bool f(num element)) => IterableMixinWorkaround.every(this, f);

  bool any(bool f(num element)) => IterableMixinWorkaround.any(this, f);

  List<num> toList({ bool growable: true }) =>
      new List<num>.from(this, growable: growable);

  Set<num> toSet() => new Set<num>.from(this);

  bool get isEmpty => this.length == 0;

  Iterable<num> take(int n) => IterableMixinWorkaround.takeList(this, n);

  Iterable<num> takeWhile(bool test(num value)) {
    return IterableMixinWorkaround.takeWhile(this, test);
  }

  Iterable<num> skip(int n) => IterableMixinWorkaround.skipList(this, n);

  Iterable<num> skipWhile(bool test(num value)) {
    return IterableMixinWorkaround.skipWhile(this, test);
  }

  num firstWhere(bool test(num value), { num orElse() }) {
    return IterableMixinWorkaround.firstWhere(this, test, orElse);
  }

  num lastWhere(bool test(num value), {num orElse()}) {
    return IterableMixinWorkaround.lastWhereList(this, test, orElse);
  }

  num singleWhere(bool test(num value)) {
    return IterableMixinWorkaround.singleWhere(this, test);
  }

  num elementAt(int index) {
    return this[index];
  }

  // From Collection<num>:

  void add(num value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(num value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Iterable<num> iterable) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  // From List<num>:
  void set length(int value) {
    throw new UnsupportedError("Cannot resize immutable List.");
  }

  void clear() {
    throw new UnsupportedError("Cannot clear immutable List.");
  }

  Iterable<num> get reversed {
    return IterableMixinWorkaround.reversedList(this);
  }

  void sort([int compare(num a, num b)]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(num element, [int start = 0]) =>
      Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(num element, [int start]) {
    if (start == null) start = length - 1;
    return Lists.lastIndexOf(this, element, start);
  }

  num get first {
    if (this.length > 0) return this[0];
    throw new StateError("No elements");
  }

  num get last {
    if (this.length > 0) return this[this.length - 1];
    throw new StateError("No elements");
  }

  num get single {
    if (length == 1) return this[0];
    if (length == 0) throw new StateError("No elements");
    throw new StateError("More than one element");
  }

  num min([int compare(num a, num b)]) =>
      IterableMixinWorkaround.min(this, compare);

  num max([int compare(num a, num b)]) =>
      IterableMixinWorkaround.max(this, compare);

  void insert(int index, num element) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  num removeAt(int pos) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  num removeLast() {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void remove(Object object) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void removeAll(Iterable elements) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void retainAll(Iterable elements) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void removeWhere(bool test(num element)) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void retainWhere(bool test(num element)) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void setRange(int start, int rangeLength, List<num> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [num initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<num> sublist(int start, [int end]) {
    if (end == null) end = length;
    return Lists.getRange(this, start, end, <num>[]);
  }

  List<num> getRange(int start, int rangeLength) =>
      sublist(start, start + rangeLength);

  Map<int, num> asMap() =>
    IterableMixinWorkaround.asMapList(this);

  // -- end List<num> mixins.

  @DomName('Float32Array.setElements')
  @DocsEditable
  void setElements(Object array, [int offset]) native "Float32Array_setElements_Callback";

  List<double> subarray(int start, [int end]) {
    if (?end) {
      return _subarray_1(start, end);
    }
    return _subarray_2(start);
  }

  @DomName('Float32Array._subarray_1')
  @DocsEditable
  List<double> _subarray_1(start, end) native "Float32Array__subarray_1_Callback";

  @DomName('Float32Array._subarray_2')
  @DocsEditable
  List<double> _subarray_2(start) native "Float32Array__subarray_2_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('Float64Array')
class Float64Array extends ArrayBufferView implements List<double> {
  Float64Array.internal() : super.internal();

  @DomName('Float64Array.Float64Array')
  @DocsEditable
  factory Float64Array(int length) =>
    _TypedArrayFactoryProvider.createFloat64Array(length);

  @DomName('Float64Array.fromList')
  @DocsEditable
  factory Float64Array.fromList(List<num> list) =>
    _TypedArrayFactoryProvider.createFloat64Array_fromList(list);

  @DomName('Float64Array.fromBuffer')
  @DocsEditable
  factory Float64Array.fromBuffer(ArrayBuffer buffer, [int byteOffset, int length]) => 
    _TypedArrayFactoryProvider.createFloat64Array_fromBuffer(buffer, byteOffset, length);

  static const int BYTES_PER_ELEMENT = 8;

  @DomName('Float64Array.length')
  @DocsEditable
  int get length native "Float64Array_length_Getter";

  @DomName('Float64Array.numericIndexGetter')
  @DocsEditable
  num operator[](int index) native "Float64Array_numericIndexGetter_Callback";

  @DomName('Float64Array.numericIndexSetter')
  @DocsEditable
  void operator[]=(int index, num value) native "Float64Array_numericIndexSetter_Callback";
  // -- start List<num> mixins.
  // num is the element type.

  // From Iterable<num>:

  Iterator<num> 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<num>(this);
  }

  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, num)) {
    return IterableMixinWorkaround.reduce(this, initialValue, combine);
  }

  bool contains(num element) => IterableMixinWorkaround.contains(this, element);

  void forEach(void f(num element)) => IterableMixinWorkaround.forEach(this, f);

  String join([String separator]) =>
      IterableMixinWorkaround.joinList(this, separator);

  Iterable map(f(num element)) =>
      IterableMixinWorkaround.mapList(this, f);

  Iterable<num> where(bool f(num element)) =>
      IterableMixinWorkaround.where(this, f);

  Iterable expand(Iterable f(num element)) =>
      IterableMixinWorkaround.expand(this, f);

  bool every(bool f(num element)) => IterableMixinWorkaround.every(this, f);

  bool any(bool f(num element)) => IterableMixinWorkaround.any(this, f);

  List<num> toList({ bool growable: true }) =>
      new List<num>.from(this, growable: growable);

  Set<num> toSet() => new Set<num>.from(this);

  bool get isEmpty => this.length == 0;

  Iterable<num> take(int n) => IterableMixinWorkaround.takeList(this, n);

  Iterable<num> takeWhile(bool test(num value)) {
    return IterableMixinWorkaround.takeWhile(this, test);
  }

  Iterable<num> skip(int n) => IterableMixinWorkaround.skipList(this, n);

  Iterable<num> skipWhile(bool test(num value)) {
    return IterableMixinWorkaround.skipWhile(this, test);
  }

  num firstWhere(bool test(num value), { num orElse() }) {
    return IterableMixinWorkaround.firstWhere(this, test, orElse);
  }

  num lastWhere(bool test(num value), {num orElse()}) {
    return IterableMixinWorkaround.lastWhereList(this, test, orElse);
  }

  num singleWhere(bool test(num value)) {
    return IterableMixinWorkaround.singleWhere(this, test);
  }

  num elementAt(int index) {
    return this[index];
  }

  // From Collection<num>:

  void add(num value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(num value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Iterable<num> iterable) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  // From List<num>:
  void set length(int value) {
    throw new UnsupportedError("Cannot resize immutable List.");
  }

  void clear() {
    throw new UnsupportedError("Cannot clear immutable List.");
  }

  Iterable<num> get reversed {
    return IterableMixinWorkaround.reversedList(this);
  }

  void sort([int compare(num a, num b)]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(num element, [int start = 0]) =>
      Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(num element, [int start]) {
    if (start == null) start = length - 1;
    return Lists.lastIndexOf(this, element, start);
  }

  num get first {
    if (this.length > 0) return this[0];
    throw new StateError("No elements");
  }

  num get last {
    if (this.length > 0) return this[this.length - 1];
    throw new StateError("No elements");
  }

  num get single {
    if (length == 1) return this[0];
    if (length == 0) throw new StateError("No elements");
    throw new StateError("More than one element");
  }

  num min([int compare(num a, num b)]) =>
      IterableMixinWorkaround.min(this, compare);

  num max([int compare(num a, num b)]) =>
      IterableMixinWorkaround.max(this, compare);

  void insert(int index, num element) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  num removeAt(int pos) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  num removeLast() {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void remove(Object object) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void removeAll(Iterable elements) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void retainAll(Iterable elements) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void removeWhere(bool test(num element)) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void retainWhere(bool test(num element)) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void setRange(int start, int rangeLength, List<num> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [num initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<num> sublist(int start, [int end]) {
    if (end == null) end = length;
    return Lists.getRange(this, start, end, <num>[]);
  }

  List<num> getRange(int start, int rangeLength) =>
      sublist(start, start + rangeLength);

  Map<int, num> asMap() =>
    IterableMixinWorkaround.asMapList(this);

  // -- end List<num> mixins.

  @DomName('Float64Array.setElements')
  @DocsEditable
  void setElements(Object array, [int offset]) native "Float64Array_setElements_Callback";

  List<double> subarray(int start, [int end]) {
    if (?end) {
      return _subarray_1(start, end);
    }
    return _subarray_2(start);
  }

  @DomName('Float64Array._subarray_1')
  @DocsEditable
  List<double> _subarray_1(start, end) native "Float64Array__subarray_1_Callback";

  @DomName('Float64Array._subarray_2')
  @DocsEditable
  List<double> _subarray_2(start) native "Float64Array__subarray_2_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('FocusEvent')
class FocusEvent extends UIEvent {
  FocusEvent.internal() : super.internal();

  @DomName('FocusEvent.relatedTarget')
  @DocsEditable
  EventTarget get relatedTarget native "FocusEvent_relatedTarget_Getter";

}
// 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.


@DocsEditable
@DomName('FormData')
@SupportedBrowser(SupportedBrowser.CHROME)
@SupportedBrowser(SupportedBrowser.FIREFOX)
@SupportedBrowser(SupportedBrowser.IE, '10')
@SupportedBrowser(SupportedBrowser.SAFARI)
class FormData extends NativeFieldWrapperClass1 {
  FormData.internal();
  factory FormData([FormElement form]) => _create(form);

  @DocsEditable
  static FormData _create(form) native "DOMFormData_constructorCallback";

  /// Checks if this type is supported on the current platform.
  static bool get supported => true;

  @DomName('DOMFormData.append')
  @DocsEditable
  void append(String name, value, [String filename]) native "DOMFormData_append_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('HTMLFormElement')
class FormElement extends _Element_Merged {
  FormElement.internal() : super.internal();

  @DomName('HTMLFormElement.HTMLFormElement')
  @DocsEditable
  factory FormElement() => document.$dom_createElement("form");

  @DomName('HTMLFormElement.acceptCharset')
  @DocsEditable
  String get acceptCharset native "HTMLFormElement_acceptCharset_Getter";

  @DomName('HTMLFormElement.acceptCharset')
  @DocsEditable
  void set acceptCharset(String value) native "HTMLFormElement_acceptCharset_Setter";

  @DomName('HTMLFormElement.action')
  @DocsEditable
  String get action native "HTMLFormElement_action_Getter";

  @DomName('HTMLFormElement.action')
  @DocsEditable
  void set action(String value) native "HTMLFormElement_action_Setter";

  @DomName('HTMLFormElement.autocomplete')
  @DocsEditable
  String get autocomplete native "HTMLFormElement_autocomplete_Getter";

  @DomName('HTMLFormElement.autocomplete')
  @DocsEditable
  void set autocomplete(String value) native "HTMLFormElement_autocomplete_Setter";

  @DomName('HTMLFormElement.encoding')
  @DocsEditable
  String get encoding native "HTMLFormElement_encoding_Getter";

  @DomName('HTMLFormElement.encoding')
  @DocsEditable
  void set encoding(String value) native "HTMLFormElement_encoding_Setter";

  @DomName('HTMLFormElement.enctype')
  @DocsEditable
  String get enctype native "HTMLFormElement_enctype_Getter";

  @DomName('HTMLFormElement.enctype')
  @DocsEditable
  void set enctype(String value) native "HTMLFormElement_enctype_Setter";

  @DomName('HTMLFormElement.length')
  @DocsEditable
  int get length native "HTMLFormElement_length_Getter";

  @DomName('HTMLFormElement.method')
  @DocsEditable
  String get method native "HTMLFormElement_method_Getter";

  @DomName('HTMLFormElement.method')
  @DocsEditable
  void set method(String value) native "HTMLFormElement_method_Setter";

  @DomName('HTMLFormElement.name')
  @DocsEditable
  String get name native "HTMLFormElement_name_Getter";

  @DomName('HTMLFormElement.name')
  @DocsEditable
  void set name(String value) native "HTMLFormElement_name_Setter";

  @DomName('HTMLFormElement.noValidate')
  @DocsEditable
  bool get noValidate native "HTMLFormElement_noValidate_Getter";

  @DomName('HTMLFormElement.noValidate')
  @DocsEditable
  void set noValidate(bool value) native "HTMLFormElement_noValidate_Setter";

  @DomName('HTMLFormElement.target')
  @DocsEditable
  String get target native "HTMLFormElement_target_Getter";

  @DomName('HTMLFormElement.target')
  @DocsEditable
  void set target(String value) native "HTMLFormElement_target_Setter";

  @DomName('HTMLFormElement.checkValidity')
  @DocsEditable
  bool checkValidity() native "HTMLFormElement_checkValidity_Callback";

  @DomName('HTMLFormElement.reset')
  @DocsEditable
  void reset() native "HTMLFormElement_reset_Callback";

  @DomName('HTMLFormElement.submit')
  @DocsEditable
  void submit() native "HTMLFormElement_submit_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('Gamepad')
class Gamepad extends NativeFieldWrapperClass1 {
  Gamepad.internal();

  @DomName('Gamepad.axes')
  @DocsEditable
  List<num> get axes native "Gamepad_axes_Getter";

  @DomName('Gamepad.buttons')
  @DocsEditable
  List<num> get buttons native "Gamepad_buttons_Getter";

  @DomName('Gamepad.id')
  @DocsEditable
  String get id native "Gamepad_id_Getter";

  @DomName('Gamepad.index')
  @DocsEditable
  int get index native "Gamepad_index_Getter";

  @DomName('Gamepad.timestamp')
  @DocsEditable
  int get timestamp native "Gamepad_timestamp_Getter";

}
// 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('Geolocation')
class Geolocation extends NativeFieldWrapperClass1 {

  @DomName('Geolocation.getCurrentPosition')
  Future<Geoposition> getCurrentPosition({bool enableHighAccuracy,
      Duration timeout, Duration maximumAge}) {
    var options = {};
    if (enableHighAccuracy != null) {
      options['enableHighAccuracy'] = enableHighAccuracy;
    }
    if (timeout != null) {
      options['timeout'] = timeout.inMilliseconds;
    }
    if (maximumAge != null) {
      options['maximumAge'] = maximumAge.inMilliseconds;
    }
    var completer = new Completer<Geoposition>();
    try {
      $dom_getCurrentPosition(
          (position) {
            completer.complete(_ensurePosition(position));
          },
          (error) {
            completer.completeError(error);
          },
          options);
    } catch (e, stacktrace) {
      completer.completeError(e, stacktrace);
    }
    return completer.future;
  }

  @DomName('Geolocation.watchPosition')
  Stream<Geoposition> watchPosition({bool enableHighAccuracy,
      Duration timeout, Duration maximumAge}) {

    var options = {};
    if (enableHighAccuracy != null) {
      options['enableHighAccuracy'] = enableHighAccuracy;
    }
    if (timeout != null) {
      options['timeout'] = timeout.inMilliseconds;
    }
    if (maximumAge != null) {
      options['maximumAge'] = maximumAge.inMilliseconds;
    }

    int watchId;
    var controller;
    controller = new StreamController<Geoposition>(
      onSubscriptionStateChange: () {
        if (controller.hasSubscribers) {
          assert(watchId == null);
          watchId = $dom_watchPosition(
              (position) {
                controller.add(_ensurePosition(position));
              },
              (error) {
                controller.addError(error);
              },
              options);
        } else {
          assert(watchId != null);
          $dom_clearWatch(watchId);
        }
      });

    return controller.stream;
  }

  Geoposition _ensurePosition(domPosition) {
    return domPosition;
  }

  Geolocation.internal();

  @DomName('Geolocation.clearWatch')
  @DocsEditable
  void $dom_clearWatch(int watchID) native "Geolocation_clearWatch_Callback";

  @DomName('Geolocation.getCurrentPosition')
  @DocsEditable
  void $dom_getCurrentPosition(_PositionCallback successCallback, [_PositionErrorCallback errorCallback, Object options]) native "Geolocation_getCurrentPosition_Callback";

  @DomName('Geolocation.watchPosition')
  @DocsEditable
  int $dom_watchPosition(_PositionCallback successCallback, [_PositionErrorCallback errorCallback, Object options]) native "Geolocation_watchPosition_Callback";
}



// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('Geoposition')
class Geoposition extends NativeFieldWrapperClass1 {
  Geoposition.internal();

  @DomName('Geoposition.coords')
  @DocsEditable
  Coordinates get coords native "Geoposition_coords_Getter";

  @DomName('Geoposition.timestamp')
  @DocsEditable
  int get timestamp native "Geoposition_timestamp_Getter";

}
// 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.


@DocsEditable
/**
 * An `<hr>` tag.
 */
@DomName('HTMLHRElement')
class HRElement extends _Element_Merged {
  HRElement.internal() : super.internal();

  @DomName('HTMLHRElement.HTMLHRElement')
  @DocsEditable
  factory HRElement() => document.$dom_createElement("hr");

}
// 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.

@DomName('HashChangeEvent')
@SupportedBrowser(SupportedBrowser.CHROME)
@SupportedBrowser(SupportedBrowser.FIREFOX)
@SupportedBrowser(SupportedBrowser.SAFARI)

class HashChangeEvent extends Event {
  factory HashChangeEvent(String type,
      {bool canBubble: true, bool cancelable: true, String oldUrl,
      String newUrl}) {
    var event = document.$dom_createEvent("HashChangeEvent");
    event.$dom_initHashChangeEvent(type, canBubble, cancelable, oldUrl, newUrl);
    return event;
  }
  HashChangeEvent.internal() : super.internal();

  /// Checks if this type is supported on the current platform.
  static bool get supported => true;

  @DomName('HashChangeEvent.newURL')
  @DocsEditable
  String get newUrl native "HashChangeEvent_newURL_Getter";

  @DomName('HashChangeEvent.oldURL')
  @DocsEditable
  String get oldUrl native "HashChangeEvent_oldURL_Getter";

  @DomName('HashChangeEvent.initHashChangeEvent')
  @DocsEditable
  void $dom_initHashChangeEvent(String type, bool canBubble, bool cancelable, String oldURL, String newURL) native "HashChangeEvent_initHashChangeEvent_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('HTMLHeadElement')
class HeadElement extends _Element_Merged {
  HeadElement.internal() : super.internal();

  @DomName('HTMLHeadElement.HTMLHeadElement')
  @DocsEditable
  factory HeadElement() => document.$dom_createElement("head");

}
// 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.


@DocsEditable
@DomName('HTMLHeadingElement')
class HeadingElement extends _Element_Merged {
  HeadingElement.internal() : super.internal();

  @DomName('HTMLHeadingElement.HTMLHeadingElement')
  @DocsEditable
  factory HeadingElement.h1() => document.$dom_createElement("h1");

  @DomName('HTMLHeadingElement.HTMLHeadingElement')
  @DocsEditable
  factory HeadingElement.h2() => document.$dom_createElement("h2");

  @DomName('HTMLHeadingElement.HTMLHeadingElement')
  @DocsEditable
  factory HeadingElement.h3() => document.$dom_createElement("h3");

  @DomName('HTMLHeadingElement.HTMLHeadingElement')
  @DocsEditable
  factory HeadingElement.h4() => document.$dom_createElement("h4");

  @DomName('HTMLHeadingElement.HTMLHeadingElement')
  @DocsEditable
  factory HeadingElement.h5() => document.$dom_createElement("h5");

  @DomName('HTMLHeadingElement.HTMLHeadingElement')
  @DocsEditable
  factory HeadingElement.h6() => document.$dom_createElement("h6");

}
// 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')
class History extends NativeFieldWrapperClass1 implements HistoryBase {

  /**
   * Checks if the State APIs are supported on the current platform.
   *
   * See also:
   *
   * * [pushState]
   * * [replaceState]
   * * [state]
   */
  static bool get supportsState => true;
  History.internal();

  @DomName('History.length')
  @DocsEditable
  int get length native "History_length_Getter";

  @DomName('History.state')
  @DocsEditable
  dynamic get state native "History_state_Getter";

  @DomName('History.back')
  @DocsEditable
  void back() native "History_back_Callback";

  @DomName('History.forward')
  @DocsEditable
  void forward() native "History_forward_Callback";

  @DomName('History.go')
  @DocsEditable
  void go(int distance) native "History_go_Callback";

  @DomName('History.pushState')
  @DocsEditable
  @SupportedBrowser(SupportedBrowser.CHROME)
  @SupportedBrowser(SupportedBrowser.FIREFOX)
  @SupportedBrowser(SupportedBrowser.IE, '10')
  @SupportedBrowser(SupportedBrowser.SAFARI)
  void pushState(Object data, String title, [String url]) native "History_pushState_Callback";

  @DomName('History.replaceState')
  @DocsEditable
  @SupportedBrowser(SupportedBrowser.CHROME)
  @SupportedBrowser(SupportedBrowser.FIREFOX)
  @SupportedBrowser(SupportedBrowser.IE, '10')
  @SupportedBrowser(SupportedBrowser.SAFARI)
  void replaceState(Object data, String title, [String url]) native "History_replaceState_Callback";
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('HTMLAllCollection')
class HtmlAllCollection extends NativeFieldWrapperClass1 implements List<Node> {
  HtmlAllCollection.internal();

  @DomName('HTMLAllCollection.length')
  @DocsEditable
  int get length native "HTMLAllCollection_length_Getter";

  Node operator[](int index) native "HTMLAllCollection_item_Callback";

  void operator[]=(int index, Node value) {
    throw new UnsupportedError("Cannot assign element of immutable List.");
  }
  // -- start List<Node> mixins.
  // Node is the element type.

  // From Iterable<Node>:

  Iterator<Node> 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<Node>(this);
  }

  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, Node)) {
    return IterableMixinWorkaround.reduce(this, initialValue, combine);
  }

  bool contains(Node element) => IterableMixinWorkaround.contains(this, element);

  void forEach(void f(Node element)) => IterableMixinWorkaround.forEach(this, f);

  String join([String separator]) =>
      IterableMixinWorkaround.joinList(this, separator);

  Iterable map(f(Node element)) =>
      IterableMixinWorkaround.mapList(this, f);

  Iterable<Node> where(bool f(Node element)) =>
      IterableMixinWorkaround.where(this, f);

  Iterable expand(Iterable f(Node element)) =>
      IterableMixinWorkaround.expand(this, f);

  bool every(bool f(Node element)) => IterableMixinWorkaround.every(this, f);

  bool any(bool f(Node element)) => IterableMixinWorkaround.any(this, f);

  List<Node> toList({ bool growable: true }) =>
      new List<Node>.from(this, growable: growable);

  Set<Node> toSet() => new Set<Node>.from(this);

  bool get isEmpty => this.length == 0;

  Iterable<Node> take(int n) => IterableMixinWorkaround.takeList(this, n);

  Iterable<Node> takeWhile(bool test(Node value)) {
    return IterableMixinWorkaround.takeWhile(this, test);
  }

  Iterable<Node> skip(int n) => IterableMixinWorkaround.skipList(this, n);

  Iterable<Node> skipWhile(bool test(Node value)) {
    return IterableMixinWorkaround.skipWhile(this, test);
  }

  Node firstWhere(bool test(Node value), { Node orElse() }) {
    return IterableMixinWorkaround.firstWhere(this, test, orElse);
  }

  Node lastWhere(bool test(Node value), {Node orElse()}) {
    return IterableMixinWorkaround.lastWhereList(this, test, orElse);
  }

  Node singleWhere(bool test(Node value)) {
    return IterableMixinWorkaround.singleWhere(this, test);
  }

  Node elementAt(int index) {
    return this[index];
  }

  // From Collection<Node>:

  void add(Node value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(Node value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Iterable<Node> iterable) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  // From List<Node>:
  void set length(int value) {
    throw new UnsupportedError("Cannot resize immutable List.");
  }

  void clear() {
    throw new UnsupportedError("Cannot clear immutable List.");
  }

  Iterable<Node> get reversed {
    return IterableMixinWorkaround.reversedList(this);
  }

  void sort([int compare(Node a, Node b)]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(Node element, [int start = 0]) =>
      Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(Node element, [int start]) {
    if (start == null) start = length - 1;
    return Lists.lastIndexOf(this, element, start);
  }

  Node get first {
    if (this.length > 0) return this[0];
    throw new StateError("No elements");
  }

  Node get last {
    if (this.length > 0) return this[this.length - 1];
    throw new StateError("No elements");
  }

  Node get single {
    if (length == 1) return this[0];
    if (length == 0) throw new StateError("No elements");
    throw new StateError("More than one element");
  }

  Node min([int compare(Node a, Node b)]) =>
      IterableMixinWorkaround.min(this, compare);

  Node max([int compare(Node a, Node b)]) =>
      IterableMixinWorkaround.max(this, compare);

  void insert(int index, Node element) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  Node removeAt(int pos) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  Node removeLast() {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void remove(Object object) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void removeAll(Iterable elements) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void retainAll(Iterable elements) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void removeWhere(bool test(Node element)) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void retainWhere(bool test(Node element)) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void setRange(int start, int rangeLength, List<Node> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [Node initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<Node> sublist(int start, [int end]) {
    if (end == null) end = length;
    return Lists.getRange(this, start, end, <Node>[]);
  }

  List<Node> getRange(int start, int rangeLength) =>
      sublist(start, start + rangeLength);

  Map<int, Node> asMap() =>
    IterableMixinWorkaround.asMapList(this);

  // -- end List<Node> mixins.

  @DomName('HTMLAllCollection.item')
  @DocsEditable
  Node item(int index) native "HTMLAllCollection_item_Callback";

  @DomName('HTMLAllCollection.namedItem')
  @DocsEditable
  Node namedItem(String name) native "HTMLAllCollection_namedItem_Callback";

  @DomName('HTMLAllCollection.tags')
  @DocsEditable
  List<Node> tags(String name) native "HTMLAllCollection_tags_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('HTMLCollection')
class HtmlCollection extends NativeFieldWrapperClass1 implements List<Node> {
  HtmlCollection.internal();

  @DomName('HTMLCollection.length')
  @DocsEditable
  int get length native "HTMLCollection_length_Getter";

  Node operator[](int index) native "HTMLCollection_item_Callback";

  void operator[]=(int index, Node value) {
    throw new UnsupportedError("Cannot assign element of immutable List.");
  }
  // -- start List<Node> mixins.
  // Node is the element type.

  // From Iterable<Node>:

  Iterator<Node> 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<Node>(this);
  }

  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, Node)) {
    return IterableMixinWorkaround.reduce(this, initialValue, combine);
  }

  bool contains(Node element) => IterableMixinWorkaround.contains(this, element);

  void forEach(void f(Node element)) => IterableMixinWorkaround.forEach(this, f);

  String join([String separator]) =>
      IterableMixinWorkaround.joinList(this, separator);

  Iterable map(f(Node element)) =>
      IterableMixinWorkaround.mapList(this, f);

  Iterable<Node> where(bool f(Node element)) =>
      IterableMixinWorkaround.where(this, f);

  Iterable expand(Iterable f(Node element)) =>
      IterableMixinWorkaround.expand(this, f);

  bool every(bool f(Node element)) => IterableMixinWorkaround.every(this, f);

  bool any(bool f(Node element)) => IterableMixinWorkaround.any(this, f);

  List<Node> toList({ bool growable: true }) =>
      new List<Node>.from(this, growable: growable);

  Set<Node> toSet() => new Set<Node>.from(this);

  bool get isEmpty => this.length == 0;

  Iterable<Node> take(int n) => IterableMixinWorkaround.takeList(this, n);

  Iterable<Node> takeWhile(bool test(Node value)) {
    return IterableMixinWorkaround.takeWhile(this, test);
  }

  Iterable<Node> skip(int n) => IterableMixinWorkaround.skipList(this, n);

  Iterable<Node> skipWhile(bool test(Node value)) {
    return IterableMixinWorkaround.skipWhile(this, test);
  }

  Node firstWhere(bool test(Node value), { Node orElse() }) {
    return IterableMixinWorkaround.firstWhere(this, test, orElse);
  }

  Node lastWhere(bool test(Node value), {Node orElse()}) {
    return IterableMixinWorkaround.lastWhereList(this, test, orElse);
  }

  Node singleWhere(bool test(Node value)) {
    return IterableMixinWorkaround.singleWhere(this, test);
  }

  Node elementAt(int index) {
    return this[index];
  }

  // From Collection<Node>:

  void add(Node value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(Node value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Iterable<Node> iterable) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  // From List<Node>:
  void set length(int value) {
    throw new UnsupportedError("Cannot resize immutable List.");
  }

  void clear() {
    throw new UnsupportedError("Cannot clear immutable List.");
  }

  Iterable<Node> get reversed {
    return IterableMixinWorkaround.reversedList(this);
  }

  void sort([int compare(Node a, Node b)]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(Node element, [int start = 0]) =>
      Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(Node element, [int start]) {
    if (start == null) start = length - 1;
    return Lists.lastIndexOf(this, element, start);
  }

  Node get first {
    if (this.length > 0) return this[0];
    throw new StateError("No elements");
  }

  Node get last {
    if (this.length > 0) return this[this.length - 1];
    throw new StateError("No elements");
  }

  Node get single {
    if (length == 1) return this[0];
    if (length == 0) throw new StateError("No elements");
    throw new StateError("More than one element");
  }

  Node min([int compare(Node a, Node b)]) =>
      IterableMixinWorkaround.min(this, compare);

  Node max([int compare(Node a, Node b)]) =>
      IterableMixinWorkaround.max(this, compare);

  void insert(int index, Node element) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  Node removeAt(int pos) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  Node removeLast() {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void remove(Object object) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void removeAll(Iterable elements) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void retainAll(Iterable elements) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void removeWhere(bool test(Node element)) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void retainWhere(bool test(Node element)) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void setRange(int start, int rangeLength, List<Node> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [Node initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<Node> sublist(int start, [int end]) {
    if (end == null) end = length;
    return Lists.getRange(this, start, end, <Node>[]);
  }

  List<Node> getRange(int start, int rangeLength) =>
      sublist(start, start + rangeLength);

  Map<int, Node> asMap() =>
    IterableMixinWorkaround.asMapList(this);

  // -- end List<Node> mixins.

  @DomName('HTMLCollection.item')
  @DocsEditable
  Node item(int index) native "HTMLCollection_item_Callback";

  @DomName('HTMLCollection.namedItem')
  @DocsEditable
  Node namedItem(String name) native "HTMLCollection_namedItem_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DomName('HTMLDocument')
class HtmlDocument extends Document {
  HtmlDocument.internal() : super.internal();

  @DomName('HTMLDocument.activeElement')
  @DocsEditable
  Element get activeElement native "HTMLDocument_activeElement_Getter";

  @DomName('Document.body')
  BodyElement get body => document.$dom_body;

  @DomName('Document.body')
  void set body(BodyElement value) {
    document.$dom_body = value;
  }

  @DomName('Document.caretRangeFromPoint')
  Range caretRangeFromPoint(int x, int y) {
    return document.$dom_caretRangeFromPoint(x, y);
  }

  @DomName('Document.elementFromPoint')
  Element elementFromPoint(int x, int y) {
    return document.$dom_elementFromPoint(x, y);
  }

  /**
   * Checks if the getCssCanvasContext API is supported on the current platform.
   *
   * See also:
   *
   * * [getCssCanvasContext]
   */
  static bool get supportsCssCanvasContext => true;


  /**
   * Gets a CanvasRenderingContext which can be used as the CSS background of an
   * element.
   *
   * CSS:
   *
   *     background: -webkit-canvas(backgroundCanvas)
   *
   * Generate the canvas:
   *
   *     var context = document.getCssCanvasContext('2d', 'backgroundCanvas',
   *         100, 100);
   *     context.fillStyle = 'red';
   *     context.fillRect(0, 0, 100, 100);
   *
   * See also:
   *
   * * [supportsCssCanvasContext]
   * * [CanvasElement.getContext]
   */
  @SupportedBrowser(SupportedBrowser.CHROME)
  @SupportedBrowser(SupportedBrowser.SAFARI)
  @Experimental
  @DomName('Document.getCSSCanvasContext')
  CanvasRenderingContext getCssCanvasContext(String contextId, String name,
      int width, int height) {
    return document.$dom_getCssCanvasContext(contextId, name, width, height);
  }

  @DomName('Document.head')
  HeadElement get head => document.$dom_head;

  @DomName('Document.lastModified')
  String get lastModified => document.$dom_lastModified;

  @DomName('Document.preferredStylesheetSet')
  String get preferredStylesheetSet => document.$dom_preferredStylesheetSet;

  @DomName('Document.referrer')
  String get referrer => document.$dom_referrer;

  @DomName('Document.selectedStylesheetSet')
  String get selectedStylesheetSet => document.$dom_selectedStylesheetSet;
  void set selectedStylesheetSet(String value) {
    document.$dom_selectedStylesheetSet = value;
  }

  @DomName('Document.styleSheets')
  List<StyleSheet> get styleSheets => document.$dom_styleSheets;

  @DomName('Document.title')
  String get title => document.$dom_title;

  @DomName('Document.title')
  void set title(String value) {
    document.$dom_title = value;
  }

  @DomName('Document.webkitCancelFullScreen')
  void webkitCancelFullScreen() {
    document.$dom_webkitCancelFullScreen();
  }

  @DomName('Document.webkitExitFullscreen')
  void webkitExitFullscreen() {
    document.$dom_webkitExitFullscreen();
  }

  @DomName('Document.webkitExitPointerLock')
  void webkitExitPointerLock() {
    document.$dom_webkitExitPointerLock();
  }

  @DomName('Document.webkitFullscreenElement')
  Element get webkitFullscreenElement => document.$dom_webkitFullscreenElement;

  @DomName('Document.webkitFullscreenEnabled')
  bool get webkitFullscreenEnabled => document.$dom_webkitFullscreenEnabled;

  @DomName('Document.webkitHidden')
  bool get webkitHidden => document.$dom_webkitHidden;

  @DomName('Document.webkitIsFullScreen')
  bool get webkitIsFullScreen => document.$dom_webkitIsFullScreen;

  @DomName('Document.webkitPointerLockElement')
  Element get webkitPointerLockElement =>
      document.$dom_webkitPointerLockElement;

  @DomName('Document.webkitVisibilityState')
  String get webkitVisibilityState => document.$dom_webkitVisibilityState;
}
// 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.


@DocsEditable
@DomName('HTMLHtmlElement')
class HtmlElement extends _Element_Merged {
  HtmlElement.internal() : super.internal();

  @DomName('HTMLHtmlElement.HTMLHtmlElement')
  @DocsEditable
  factory HtmlElement() => document.$dom_createElement("html");

}
// 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.


@DocsEditable
@DomName('HTMLFormControlsCollection')
class HtmlFormControlsCollection extends HtmlCollection {
  HtmlFormControlsCollection.internal() : super.internal();

  @DomName('HTMLFormControlsCollection.namedItem')
  @DocsEditable
  Node namedItem(String name) native "HTMLFormControlsCollection_namedItem_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('HTMLOptionsCollection')
class HtmlOptionsCollection extends HtmlCollection {
  HtmlOptionsCollection.internal() : super.internal();

  @DomName('HTMLOptionsCollection.numericIndexSetter')
  @DocsEditable
  void operator[]=(int index, Node value) native "HTMLOptionsCollection_numericIndexSetter_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.


/**
 * A utility for retrieving data from a URL.
 *
 * HttpRequest can be used to obtain data from http, ftp, and file
 * protocols.
 *
 * For example, suppose we're developing these API docs, and we
 * wish to retrieve the HTML of the top-level page and print it out.
 * The easiest way to do that would be:
 *
 *     var httpRequest = HttpRequest.get('http://api.dartlang.org',
 *         (request) => print(request.responseText));
 *
 * **Important**: With the default behavior of this class, your
 * code making the request should be served from the same origin (domain name,
 * port, and application layer protocol) as the URL you are trying to access
 * with HttpRequest. However, there are ways to
 * [get around this restriction](http://www.dartlang.org/articles/json-web-service/#note-on-jsonp).
 *
 * See also:
 *
 * * [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')
class HttpRequest extends EventTarget {

  /**
   * Creates a URL 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.
   *
   * See also:
   *
   * * [request]
   */
  static Future<String> getString(String url,
      {bool withCredentials, void onProgress(ProgressEvent e)}) {
    return request(url, withCredentials: withCredentials,
        onProgress: onProgress).then((xhr) => xhr.responseText);
  }

  /**
   * Creates a URL request for the specified [url].
   *
   * By default this will do an HTTP GET request, this can be overridden with
   * [method].
   *
   * The Future is completed when the response is available.
   *
   * 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].
   *
   * 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, 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 (onProgress != null) {
      xhr.onProgress.listen(onProgress);
    }

    xhr.onLoad.listen((e) {
      // Note: file:// URIs have status of 0.
      if ((xhr.status >= 200 && xhr.status < 300) ||
          xhr.status == 0 || xhr.status == 304) {
        completer.complete(xhr);
      } else {
        completer.completeError(e);
      }
    });

    xhr.onError.listen((e) {
      completer.completeError(e);
    });

    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 LoadEnd event is supported on the current platform.
   */
  static bool get supportsLoadEndEvent {
    return true;
  }

  HttpRequest.internal() : super.internal();

  @DomName('XMLHttpRequest.abortEvent')
  @DocsEditable
  static const EventStreamProvider<ProgressEvent> abortEvent = const EventStreamProvider<ProgressEvent>('abort');

  @DomName('XMLHttpRequest.errorEvent')
  @DocsEditable
  static const EventStreamProvider<ProgressEvent> errorEvent = const EventStreamProvider<ProgressEvent>('error');

  @DomName('XMLHttpRequest.loadEvent')
  @DocsEditable
  static const EventStreamProvider<ProgressEvent> loadEvent = const EventStreamProvider<ProgressEvent>('load');

  @DomName('XMLHttpRequest.loadendEvent')
  @DocsEditable
  static const EventStreamProvider<ProgressEvent> loadEndEvent = const EventStreamProvider<ProgressEvent>('loadend');

  @DomName('XMLHttpRequest.loadstartEvent')
  @DocsEditable
  static const EventStreamProvider<ProgressEvent> loadStartEvent = const EventStreamProvider<ProgressEvent>('loadstart');

  @DomName('XMLHttpRequest.progressEvent')
  @DocsEditable
  static const EventStreamProvider<ProgressEvent> progressEvent = const EventStreamProvider<ProgressEvent>('progress');

  @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.on.load.add((event) => print('Request complete'));
   *
   * is the (more verbose) equivalent of
   *
   *     var request = new HttpRequest.get('http://dartlang.org',
   *         (event) => print('Request complete'));
   */
  @DomName('XMLHttpRequest.XMLHttpRequest')
  @DocsEditable
  factory HttpRequest() {
    return HttpRequest._create_1();
  }

  @DocsEditable
  static HttpRequest _create_1() native "XMLHttpRequest__create_1constructorCallback";

  static const int DONE = 4;

  static const int HEADERS_RECEIVED = 2;

  static const int LOADING = 3;

  static const int OPENED = 1;

  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 native "XMLHttpRequest_readyState_Getter";

  /**
   * The data received as a reponse from the request.
   *
   * The data could be in the
   * form of a [String], [ArrayBuffer], [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)
  Object get response native "XMLHttpRequest_response_Getter";

  /**
   * The response in string form or `null on failure.
   */
  @DomName('XMLHttpRequest.responseText')
  @DocsEditable
  String get responseText native "XMLHttpRequest_responseText_Getter";

  /**
   * [String] telling the server the desired response format.
   *
   * Default is `String`.
   * Other options are one of 'arraybuffer', 'blob', 'document', 'json',
   * 'text'. Some newer browsers will throw NS_ERROR_DOM_INVALID_ACCESS_ERR if
   * `responseType` is set while performing a synchronous request.
   *
   * See also: [MDN responseType](https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest#responseType)
   */
  @DomName('XMLHttpRequest.responseType')
  @DocsEditable
  String get responseType native "XMLHttpRequest_responseType_Getter";

  /**
   * [String] telling the server the desired response format.
   *
   * Default is `String`.
   * Other options are one of 'arraybuffer', 'blob', 'document', 'json',
   * 'text'. Some newer browsers will throw NS_ERROR_DOM_INVALID_ACCESS_ERR if
   * `responseType` is set while performing a synchronous request.
   *
   * See also: [MDN responseType](https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest#responseType)
   */
  @DomName('XMLHttpRequest.responseType')
  @DocsEditable
  void set responseType(String value) native "XMLHttpRequest_responseType_Setter";

  /**
   * 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 native "XMLHttpRequest_responseXML_Getter";

  /**
   * 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 native "XMLHttpRequest_status_Getter";

  /**
   * 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 native "XMLHttpRequest_statusText_Getter";

  /**
   * [EventTarget] that can hold listeners to track the progress of the request.
   * The events fired will be members of [HttpRequestUploadEvents].
   */
  @DomName('XMLHttpRequest.upload')
  @DocsEditable
  HttpRequestUpload get upload native "XMLHttpRequest_upload_Getter";

  /**
   * 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 native "XMLHttpRequest_withCredentials_Getter";

  /**
   * 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 value) native "XMLHttpRequest_withCredentials_Setter";

  /**
   * 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() native "XMLHttpRequest_abort_Callback";

  @DomName('XMLHttpRequest.addEventListener')
  @DocsEditable
  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "XMLHttpRequest_addEventListener_Callback";

  @DomName('XMLHttpRequest.dispatchEvent')
  @DocsEditable
  bool dispatchEvent(Event evt) native "XMLHttpRequest_dispatchEvent_Callback";

  /**
   * 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
  String getAllResponseHeaders() native "XMLHttpRequest_getAllResponseHeaders_Callback";

  /**
   * 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
  String getResponseHeader(String header) native "XMLHttpRequest_getResponseHeader_Callback";

  /**
   * 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`.
   */
  @DomName('XMLHttpRequest.open')
  @DocsEditable
  void open(String method, String url, {bool async, String user, String password}) native "XMLHttpRequest_open_Callback";

  /**
   * 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
  void overrideMimeType(String override) native "XMLHttpRequest_overrideMimeType_Callback";

  @DomName('XMLHttpRequest.removeEventListener')
  @DocsEditable
  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "XMLHttpRequest_removeEventListener_Callback";

  /**
   * Send the request with any given `data`.
   *
   * See also:
   * [send() docs](https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest#send())
   * from MDN.
   */
  @DomName('XMLHttpRequest.send')
  @DocsEditable
  void send([data]) native "XMLHttpRequest_send_Callback";

  @DomName('XMLHttpRequest.setRequestHeader')
  @DocsEditable
  void setRequestHeader(String header, String value) native "XMLHttpRequest_setRequestHeader_Callback";

  /**
   * Event listeners to be notified when request has been aborted,
   * generally due to calling `httpRequest.abort()`.
   */
  @DomName('XMLHttpRequest.onabort')
  @DocsEditable
  Stream<ProgressEvent> get onAbort => abortEvent.forTarget(this);

  /**
   * Event listeners to be notified when a request has failed, such as when a
   * cross-domain error occurred or the file wasn't found on the server.
   */
  @DomName('XMLHttpRequest.onerror')
  @DocsEditable
  Stream<ProgressEvent> get onError => errorEvent.forTarget(this);

  /**
   * Event listeners to be notified once the request has completed
   * *successfully*.
   */
  @DomName('XMLHttpRequest.onload')
  @DocsEditable
  Stream<ProgressEvent> get onLoad => loadEvent.forTarget(this);

  /**
   * Event listeners to be notified once the request has completed (on
   * either success or failure).
   */
  @DomName('XMLHttpRequest.onloadend')
  @DocsEditable
  @SupportedBrowser(SupportedBrowser.CHROME)
  @SupportedBrowser(SupportedBrowser.FIREFOX)
  @SupportedBrowser(SupportedBrowser.IE, '10')
  @SupportedBrowser(SupportedBrowser.SAFARI)
  Stream<ProgressEvent> get onLoadEnd => loadEndEvent.forTarget(this);

  /**
   * Event listeners to be notified when the request starts, once
   * `httpRequest.send()` has been called.
   */
  @DomName('XMLHttpRequest.onloadstart')
  @DocsEditable
  Stream<ProgressEvent> get onLoadStart => loadStartEvent.forTarget(this);

  /**
   * Event listeners to be notified when data for the request
   * is being sent or loaded.
   *
   * Progress events are fired every 50ms or for every byte transmitted,
   * whichever is less frequent.
   */
  @DomName('XMLHttpRequest.onprogress')
  @DocsEditable
  @SupportedBrowser(SupportedBrowser.CHROME)
  @SupportedBrowser(SupportedBrowser.FIREFOX)
  @SupportedBrowser(SupportedBrowser.IE, '10')
  @SupportedBrowser(SupportedBrowser.SAFARI)
  Stream<ProgressEvent> get onProgress => progressEvent.forTarget(this);

  /**
   * 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.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('XMLHttpRequestException')
class HttpRequestException extends NativeFieldWrapperClass1 {
  HttpRequestException.internal();

  static const int ABORT_ERR = 102;

  static const int NETWORK_ERR = 101;

  @DomName('XMLHttpRequestException.code')
  @DocsEditable
  int get code native "XMLHttpRequestException_code_Getter";

  @DomName('XMLHttpRequestException.message')
  @DocsEditable
  String get message native "XMLHttpRequestException_message_Getter";

  @DomName('XMLHttpRequestException.name')
  @DocsEditable
  String get name native "XMLHttpRequestException_name_Getter";

  @DomName('XMLHttpRequestException.toString')
  @DocsEditable
  String toString() native "XMLHttpRequestException_toString_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('XMLHttpRequestProgressEvent')
@SupportedBrowser(SupportedBrowser.CHROME)
@SupportedBrowser(SupportedBrowser.SAFARI)
@Experimental
class HttpRequestProgressEvent extends ProgressEvent {
  HttpRequestProgressEvent.internal() : super.internal();

  /// Checks if this type is supported on the current platform.
  static bool get supported => true;

  @DomName('XMLHttpRequestProgressEvent.position')
  @DocsEditable
  int get position native "XMLHttpRequestProgressEvent_position_Getter";

  @DomName('XMLHttpRequestProgressEvent.totalSize')
  @DocsEditable
  int get totalSize native "XMLHttpRequestProgressEvent_totalSize_Getter";

}
// 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.


@DocsEditable
@DomName('XMLHttpRequestUpload')
class HttpRequestUpload extends EventTarget {
  HttpRequestUpload.internal() : super.internal();

  @DomName('XMLHttpRequestUpload.abortEvent')
  @DocsEditable
  static const EventStreamProvider<ProgressEvent> abortEvent = const EventStreamProvider<ProgressEvent>('abort');

  @DomName('XMLHttpRequestUpload.errorEvent')
  @DocsEditable
  static const EventStreamProvider<ProgressEvent> errorEvent = const EventStreamProvider<ProgressEvent>('error');

  @DomName('XMLHttpRequestUpload.loadEvent')
  @DocsEditable
  static const EventStreamProvider<ProgressEvent> loadEvent = const EventStreamProvider<ProgressEvent>('load');

  @DomName('XMLHttpRequestUpload.loadendEvent')
  @DocsEditable
  static const EventStreamProvider<ProgressEvent> loadEndEvent = const EventStreamProvider<ProgressEvent>('loadend');

  @DomName('XMLHttpRequestUpload.loadstartEvent')
  @DocsEditable
  static const EventStreamProvider<ProgressEvent> loadStartEvent = const EventStreamProvider<ProgressEvent>('loadstart');

  @DomName('XMLHttpRequestUpload.progressEvent')
  @DocsEditable
  static const EventStreamProvider<ProgressEvent> progressEvent = const EventStreamProvider<ProgressEvent>('progress');

  @DomName('XMLHttpRequestUpload.addEventListener')
  @DocsEditable
  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "XMLHttpRequestUpload_addEventListener_Callback";

  @DomName('XMLHttpRequestUpload.dispatchEvent')
  @DocsEditable
  bool dispatchEvent(Event evt) native "XMLHttpRequestUpload_dispatchEvent_Callback";

  @DomName('XMLHttpRequestUpload.removeEventListener')
  @DocsEditable
  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "XMLHttpRequestUpload_removeEventListener_Callback";

  @DomName('XMLHttpRequestUpload.onabort')
  @DocsEditable
  Stream<ProgressEvent> get onAbort => abortEvent.forTarget(this);

  @DomName('XMLHttpRequestUpload.onerror')
  @DocsEditable
  Stream<ProgressEvent> get onError => errorEvent.forTarget(this);

  @DomName('XMLHttpRequestUpload.onload')
  @DocsEditable
  Stream<ProgressEvent> get onLoad => loadEvent.forTarget(this);

  @DomName('XMLHttpRequestUpload.onloadend')
  @DocsEditable
  Stream<ProgressEvent> get onLoadEnd => loadEndEvent.forTarget(this);

  @DomName('XMLHttpRequestUpload.onloadstart')
  @DocsEditable
  Stream<ProgressEvent> get onLoadStart => loadStartEvent.forTarget(this);

  @DomName('XMLHttpRequestUpload.onprogress')
  @DocsEditable
  Stream<ProgressEvent> get onProgress => progressEvent.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.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('HTMLIFrameElement')
class IFrameElement extends _Element_Merged {
  IFrameElement.internal() : super.internal();

  @DomName('HTMLIFrameElement.HTMLIFrameElement')
  @DocsEditable
  factory IFrameElement() => document.$dom_createElement("iframe");

  @DomName('HTMLIFrameElement.contentWindow')
  @DocsEditable
  WindowBase get contentWindow native "HTMLIFrameElement_contentWindow_Getter";

  @DomName('HTMLIFrameElement.height')
  @DocsEditable
  String get height native "HTMLIFrameElement_height_Getter";

  @DomName('HTMLIFrameElement.height')
  @DocsEditable
  void set height(String value) native "HTMLIFrameElement_height_Setter";

  @DomName('HTMLIFrameElement.name')
  @DocsEditable
  String get name native "HTMLIFrameElement_name_Getter";

  @DomName('HTMLIFrameElement.name')
  @DocsEditable
  void set name(String value) native "HTMLIFrameElement_name_Setter";

  @DomName('HTMLIFrameElement.sandbox')
  @DocsEditable
  String get sandbox native "HTMLIFrameElement_sandbox_Getter";

  @DomName('HTMLIFrameElement.sandbox')
  @DocsEditable
  void set sandbox(String value) native "HTMLIFrameElement_sandbox_Setter";

  @DomName('HTMLIFrameElement.src')
  @DocsEditable
  String get src native "HTMLIFrameElement_src_Getter";

  @DomName('HTMLIFrameElement.src')
  @DocsEditable
  void set src(String value) native "HTMLIFrameElement_src_Setter";

  @DomName('HTMLIFrameElement.srcdoc')
  @DocsEditable
  String get srcdoc native "HTMLIFrameElement_srcdoc_Getter";

  @DomName('HTMLIFrameElement.srcdoc')
  @DocsEditable
  void set srcdoc(String value) native "HTMLIFrameElement_srcdoc_Setter";

  @DomName('HTMLIFrameElement.width')
  @DocsEditable
  String get width native "HTMLIFrameElement_width_Getter";

  @DomName('HTMLIFrameElement.width')
  @DocsEditable
  void set width(String value) native "HTMLIFrameElement_width_Setter";

}
// 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.

@DomName('ImageData')

class ImageData extends NativeFieldWrapperClass1 {
  List<int> __data;

  List<int> get data {
    if (__data == null) {
      __data = _data;
    }
    return __data;
  }

  ImageData.internal();

  @DomName('ImageData.data')
  @DocsEditable
  List<int> get _data native "ImageData_data_Getter";

  @DomName('ImageData.height')
  @DocsEditable
  int get height native "ImageData_height_Getter";

  @DomName('ImageData.width')
  @DocsEditable
  int get width native "ImageData_width_Getter";

}
// 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('HTMLImageElement')
class ImageElement extends _Element_Merged implements CanvasImageSource {
  ImageElement.internal() : super.internal();

  @DomName('HTMLImageElement.HTMLImageElement')
  @DocsEditable
  factory ImageElement({String src, int width, int height}) {
    var e = document.$dom_createElement("img");
    if (src != null) e.src = src;
    if (width != null) e.width = width;
    if (height != null) e.height = height;
    return e;
  }

  @DomName('HTMLImageElement.alt')
  @DocsEditable
  String get alt native "HTMLImageElement_alt_Getter";

  @DomName('HTMLImageElement.alt')
  @DocsEditable
  void set alt(String value) native "HTMLImageElement_alt_Setter";

  @DomName('HTMLImageElement.border')
  @DocsEditable
  String get border native "HTMLImageElement_border_Getter";

  @DomName('HTMLImageElement.border')
  @DocsEditable
  void set border(String value) native "HTMLImageElement_border_Setter";

  @DomName('HTMLImageElement.complete')
  @DocsEditable
  bool get complete native "HTMLImageElement_complete_Getter";

  @DomName('HTMLImageElement.crossOrigin')
  @DocsEditable
  String get crossOrigin native "HTMLImageElement_crossOrigin_Getter";

  @DomName('HTMLImageElement.crossOrigin')
  @DocsEditable
  void set crossOrigin(String value) native "HTMLImageElement_crossOrigin_Setter";

  @DomName('HTMLImageElement.height')
  @DocsEditable
  int get height native "HTMLImageElement_height_Getter";

  @DomName('HTMLImageElement.height')
  @DocsEditable
  void set height(int value) native "HTMLImageElement_height_Setter";

  @DomName('HTMLImageElement.isMap')
  @DocsEditable
  bool get isMap native "HTMLImageElement_isMap_Getter";

  @DomName('HTMLImageElement.isMap')
  @DocsEditable
  void set isMap(bool value) native "HTMLImageElement_isMap_Setter";

  @DomName('HTMLImageElement.lowsrc')
  @DocsEditable
  String get lowsrc native "HTMLImageElement_lowsrc_Getter";

  @DomName('HTMLImageElement.lowsrc')
  @DocsEditable
  void set lowsrc(String value) native "HTMLImageElement_lowsrc_Setter";

  @DomName('HTMLImageElement.naturalHeight')
  @DocsEditable
  int get naturalHeight native "HTMLImageElement_naturalHeight_Getter";

  @DomName('HTMLImageElement.naturalWidth')
  @DocsEditable
  int get naturalWidth native "HTMLImageElement_naturalWidth_Getter";

  @DomName('HTMLImageElement.src')
  @DocsEditable
  String get src native "HTMLImageElement_src_Getter";

  @DomName('HTMLImageElement.src')
  @DocsEditable
  void set src(String value) native "HTMLImageElement_src_Setter";

  @DomName('HTMLImageElement.useMap')
  @DocsEditable
  String get useMap native "HTMLImageElement_useMap_Getter";

  @DomName('HTMLImageElement.useMap')
  @DocsEditable
  void set useMap(String value) native "HTMLImageElement_useMap_Setter";

  @DomName('HTMLImageElement.width')
  @DocsEditable
  int get width native "HTMLImageElement_width_Getter";

  @DomName('HTMLImageElement.width')
  @DocsEditable
  void set width(int value) native "HTMLImageElement_width_Setter";

  @DomName('HTMLImageElement.x')
  @DocsEditable
  int get x native "HTMLImageElement_x_Getter";

  @DomName('HTMLImageElement.y')
  @DocsEditable
  int get y native "HTMLImageElement_y_Getter";

}
// 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')
class InputElement extends _Element_Merged 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}) {
    var e = document.$dom_createElement("input");
    if (type != null) {
      try {
        // IE throws an exception for unknown types.
        e.type = type;
      } catch(_) {}
    }
    return e;
  }
  InputElement.internal() : super.internal();

  @DomName('HTMLInputElement.webkitSpeechChangeEvent')
  @DocsEditable
  @SupportedBrowser(SupportedBrowser.CHROME)
  @SupportedBrowser(SupportedBrowser.SAFARI)
  @Experimental
  static const EventStreamProvider<Event> speechChangeEvent = const EventStreamProvider<Event>('webkitSpeechChange');

  @DomName('HTMLInputElement.accept')
  @DocsEditable
  String get accept native "HTMLInputElement_accept_Getter";

  @DomName('HTMLInputElement.accept')
  @DocsEditable
  void set accept(String value) native "HTMLInputElement_accept_Setter";

  @DomName('HTMLInputElement.alt')
  @DocsEditable
  String get alt native "HTMLInputElement_alt_Getter";

  @DomName('HTMLInputElement.alt')
  @DocsEditable
  void set alt(String value) native "HTMLInputElement_alt_Setter";

  @DomName('HTMLInputElement.autocomplete')
  @DocsEditable
  String get autocomplete native "HTMLInputElement_autocomplete_Getter";

  @DomName('HTMLInputElement.autocomplete')
  @DocsEditable
  void set autocomplete(String value) native "HTMLInputElement_autocomplete_Setter";

  @DomName('HTMLInputElement.autofocus')
  @DocsEditable
  bool get autofocus native "HTMLInputElement_autofocus_Getter";

  @DomName('HTMLInputElement.autofocus')
  @DocsEditable
  void set autofocus(bool value) native "HTMLInputElement_autofocus_Setter";

  @DomName('HTMLInputElement.checked')
  @DocsEditable
  bool get checked native "HTMLInputElement_checked_Getter";

  @DomName('HTMLInputElement.checked')
  @DocsEditable
  void set checked(bool value) native "HTMLInputElement_checked_Setter";

  @DomName('HTMLInputElement.defaultChecked')
  @DocsEditable
  bool get defaultChecked native "HTMLInputElement_defaultChecked_Getter";

  @DomName('HTMLInputElement.defaultChecked')
  @DocsEditable
  void set defaultChecked(bool value) native "HTMLInputElement_defaultChecked_Setter";

  @DomName('HTMLInputElement.defaultValue')
  @DocsEditable
  String get defaultValue native "HTMLInputElement_defaultValue_Getter";

  @DomName('HTMLInputElement.defaultValue')
  @DocsEditable
  void set defaultValue(String value) native "HTMLInputElement_defaultValue_Setter";

  @DomName('HTMLInputElement.dirName')
  @DocsEditable
  String get dirName native "HTMLInputElement_dirName_Getter";

  @DomName('HTMLInputElement.dirName')
  @DocsEditable
  void set dirName(String value) native "HTMLInputElement_dirName_Setter";

  @DomName('HTMLInputElement.disabled')
  @DocsEditable
  bool get disabled native "HTMLInputElement_disabled_Getter";

  @DomName('HTMLInputElement.disabled')
  @DocsEditable
  void set disabled(bool value) native "HTMLInputElement_disabled_Setter";

  @DomName('HTMLInputElement.files')
  @DocsEditable
  List<File> get files native "HTMLInputElement_files_Getter";

  @DomName('HTMLInputElement.files')
  @DocsEditable
  void set files(List<File> value) native "HTMLInputElement_files_Setter";

  @DomName('HTMLInputElement.form')
  @DocsEditable
  FormElement get form native "HTMLInputElement_form_Getter";

  @DomName('HTMLInputElement.formAction')
  @DocsEditable
  String get formAction native "HTMLInputElement_formAction_Getter";

  @DomName('HTMLInputElement.formAction')
  @DocsEditable
  void set formAction(String value) native "HTMLInputElement_formAction_Setter";

  @DomName('HTMLInputElement.formEnctype')
  @DocsEditable
  String get formEnctype native "HTMLInputElement_formEnctype_Getter";

  @DomName('HTMLInputElement.formEnctype')
  @DocsEditable
  void set formEnctype(String value) native "HTMLInputElement_formEnctype_Setter";

  @DomName('HTMLInputElement.formMethod')
  @DocsEditable
  String get formMethod native "HTMLInputElement_formMethod_Getter";

  @DomName('HTMLInputElement.formMethod')
  @DocsEditable
  void set formMethod(String value) native "HTMLInputElement_formMethod_Setter";

  @DomName('HTMLInputElement.formNoValidate')
  @DocsEditable
  bool get formNoValidate native "HTMLInputElement_formNoValidate_Getter";

  @DomName('HTMLInputElement.formNoValidate')
  @DocsEditable
  void set formNoValidate(bool value) native "HTMLInputElement_formNoValidate_Setter";

  @DomName('HTMLInputElement.formTarget')
  @DocsEditable
  String get formTarget native "HTMLInputElement_formTarget_Getter";

  @DomName('HTMLInputElement.formTarget')
  @DocsEditable
  void set formTarget(String value) native "HTMLInputElement_formTarget_Setter";

  @DomName('HTMLInputElement.height')
  @DocsEditable
  int get height native "HTMLInputElement_height_Getter";

  @DomName('HTMLInputElement.height')
  @DocsEditable
  void set height(int value) native "HTMLInputElement_height_Setter";

  @DomName('HTMLInputElement.incremental')
  @DocsEditable
  bool get incremental native "HTMLInputElement_incremental_Getter";

  @DomName('HTMLInputElement.incremental')
  @DocsEditable
  void set incremental(bool value) native "HTMLInputElement_incremental_Setter";

  @DomName('HTMLInputElement.indeterminate')
  @DocsEditable
  bool get indeterminate native "HTMLInputElement_indeterminate_Getter";

  @DomName('HTMLInputElement.indeterminate')
  @DocsEditable
  void set indeterminate(bool value) native "HTMLInputElement_indeterminate_Setter";

  @DomName('HTMLInputElement.labels')
  @DocsEditable
  List<Node> get labels native "HTMLInputElement_labels_Getter";

  @DomName('HTMLInputElement.list')
  @DocsEditable
  Element get list native "HTMLInputElement_list_Getter";

  @DomName('HTMLInputElement.max')
  @DocsEditable
  String get max native "HTMLInputElement_max_Getter";

  @DomName('HTMLInputElement.max')
  @DocsEditable
  void set max(String value) native "HTMLInputElement_max_Setter";

  @DomName('HTMLInputElement.maxLength')
  @DocsEditable
  int get maxLength native "HTMLInputElement_maxLength_Getter";

  @DomName('HTMLInputElement.maxLength')
  @DocsEditable
  void set maxLength(int value) native "HTMLInputElement_maxLength_Setter";

  @DomName('HTMLInputElement.min')
  @DocsEditable
  String get min native "HTMLInputElement_min_Getter";

  @DomName('HTMLInputElement.min')
  @DocsEditable
  void set min(String value) native "HTMLInputElement_min_Setter";

  @DomName('HTMLInputElement.multiple')
  @DocsEditable
  bool get multiple native "HTMLInputElement_multiple_Getter";

  @DomName('HTMLInputElement.multiple')
  @DocsEditable
  void set multiple(bool value) native "HTMLInputElement_multiple_Setter";

  @DomName('HTMLInputElement.name')
  @DocsEditable
  String get name native "HTMLInputElement_name_Getter";

  @DomName('HTMLInputElement.name')
  @DocsEditable
  void set name(String value) native "HTMLInputElement_name_Setter";

  @DomName('HTMLInputElement.pattern')
  @DocsEditable
  String get pattern native "HTMLInputElement_pattern_Getter";

  @DomName('HTMLInputElement.pattern')
  @DocsEditable
  void set pattern(String value) native "HTMLInputElement_pattern_Setter";

  @DomName('HTMLInputElement.placeholder')
  @DocsEditable
  String get placeholder native "HTMLInputElement_placeholder_Getter";

  @DomName('HTMLInputElement.placeholder')
  @DocsEditable
  void set placeholder(String value) native "HTMLInputElement_placeholder_Setter";

  @DomName('HTMLInputElement.readOnly')
  @DocsEditable
  bool get readOnly native "HTMLInputElement_readOnly_Getter";

  @DomName('HTMLInputElement.readOnly')
  @DocsEditable
  void set readOnly(bool value) native "HTMLInputElement_readOnly_Setter";

  @DomName('HTMLInputElement.required')
  @DocsEditable
  bool get required native "HTMLInputElement_required_Getter";

  @DomName('HTMLInputElement.required')
  @DocsEditable
  void set required(bool value) native "HTMLInputElement_required_Setter";

  @DomName('HTMLInputElement.selectionDirection')
  @DocsEditable
  String get selectionDirection native "HTMLInputElement_selectionDirection_Getter";

  @DomName('HTMLInputElement.selectionDirection')
  @DocsEditable
  void set selectionDirection(String value) native "HTMLInputElement_selectionDirection_Setter";

  @DomName('HTMLInputElement.selectionEnd')
  @DocsEditable
  int get selectionEnd native "HTMLInputElement_selectionEnd_Getter";

  @DomName('HTMLInputElement.selectionEnd')
  @DocsEditable
  void set selectionEnd(int value) native "HTMLInputElement_selectionEnd_Setter";

  @DomName('HTMLInputElement.selectionStart')
  @DocsEditable
  int get selectionStart native "HTMLInputElement_selectionStart_Getter";

  @DomName('HTMLInputElement.selectionStart')
  @DocsEditable
  void set selectionStart(int value) native "HTMLInputElement_selectionStart_Setter";

  @DomName('HTMLInputElement.size')
  @DocsEditable
  int get size native "HTMLInputElement_size_Getter";

  @DomName('HTMLInputElement.size')
  @DocsEditable
  void set size(int value) native "HTMLInputElement_size_Setter";

  @DomName('HTMLInputElement.src')
  @DocsEditable
  String get src native "HTMLInputElement_src_Getter";

  @DomName('HTMLInputElement.src')
  @DocsEditable
  void set src(String value) native "HTMLInputElement_src_Setter";

  @DomName('HTMLInputElement.step')
  @DocsEditable
  String get step native "HTMLInputElement_step_Getter";

  @DomName('HTMLInputElement.step')
  @DocsEditable
  void set step(String value) native "HTMLInputElement_step_Setter";

  @DomName('HTMLInputElement.type')
  @DocsEditable
  String get type native "HTMLInputElement_type_Getter";

  @DomName('HTMLInputElement.type')
  @DocsEditable
  void set type(String value) native "HTMLInputElement_type_Setter";

  @DomName('HTMLInputElement.useMap')
  @DocsEditable
  String get useMap native "HTMLInputElement_useMap_Getter";

  @DomName('HTMLInputElement.useMap')
  @DocsEditable
  void set useMap(String value) native "HTMLInputElement_useMap_Setter";

  @DomName('HTMLInputElement.validationMessage')
  @DocsEditable
  String get validationMessage native "HTMLInputElement_validationMessage_Getter";

  @DomName('HTMLInputElement.validity')
  @DocsEditable
  ValidityState get validity native "HTMLInputElement_validity_Getter";

  @DomName('HTMLInputElement.value')
  @DocsEditable
  String get value native "HTMLInputElement_value_Getter";

  @DomName('HTMLInputElement.value')
  @DocsEditable
  void set value(String value) native "HTMLInputElement_value_Setter";

  @DomName('HTMLInputElement.valueAsDate')
  @DocsEditable
  DateTime get valueAsDate native "HTMLInputElement_valueAsDate_Getter";

  @DomName('HTMLInputElement.valueAsDate')
  @DocsEditable
  void set valueAsDate(DateTime value) native "HTMLInputElement_valueAsDate_Setter";

  @DomName('HTMLInputElement.valueAsNumber')
  @DocsEditable
  num get valueAsNumber native "HTMLInputElement_valueAsNumber_Getter";

  @DomName('HTMLInputElement.valueAsNumber')
  @DocsEditable
  void set valueAsNumber(num value) native "HTMLInputElement_valueAsNumber_Setter";

  @DomName('HTMLInputElement.webkitEntries')
  @DocsEditable
  @SupportedBrowser(SupportedBrowser.CHROME)
  @SupportedBrowser(SupportedBrowser.SAFARI)
  @Experimental
  List<Entry> get entries native "HTMLInputElement_webkitEntries_Getter";

  @DomName('HTMLInputElement.webkitGrammar')
  @DocsEditable
  @SupportedBrowser(SupportedBrowser.CHROME)
  @SupportedBrowser(SupportedBrowser.SAFARI)
  @Experimental
  bool get grammar native "HTMLInputElement_webkitGrammar_Getter";

  @DomName('HTMLInputElement.webkitGrammar')
  @DocsEditable
  @SupportedBrowser(SupportedBrowser.CHROME)
  @SupportedBrowser(SupportedBrowser.SAFARI)
  @Experimental
  void set grammar(bool value) native "HTMLInputElement_webkitGrammar_Setter";

  @DomName('HTMLInputElement.webkitSpeech')
  @DocsEditable
  @SupportedBrowser(SupportedBrowser.CHROME)
  @SupportedBrowser(SupportedBrowser.SAFARI)
  @Experimental
  bool get speech native "HTMLInputElement_webkitSpeech_Getter";

  @DomName('HTMLInputElement.webkitSpeech')
  @DocsEditable
  @SupportedBrowser(SupportedBrowser.CHROME)
  @SupportedBrowser(SupportedBrowser.SAFARI)
  @Experimental
  void set speech(bool value) native "HTMLInputElement_webkitSpeech_Setter";

  @DomName('HTMLInputElement.webkitdirectory')
  @DocsEditable
  @SupportedBrowser(SupportedBrowser.CHROME)
  @SupportedBrowser(SupportedBrowser.SAFARI)
  @Experimental
  bool get directory native "HTMLInputElement_webkitdirectory_Getter";

  @DomName('HTMLInputElement.webkitdirectory')
  @DocsEditable
  @SupportedBrowser(SupportedBrowser.CHROME)
  @SupportedBrowser(SupportedBrowser.SAFARI)
  @Experimental
  void set directory(bool value) native "HTMLInputElement_webkitdirectory_Setter";

  @DomName('HTMLInputElement.width')
  @DocsEditable
  int get width native "HTMLInputElement_width_Getter";

  @DomName('HTMLInputElement.width')
  @DocsEditable
  void set width(int value) native "HTMLInputElement_width_Setter";

  @DomName('HTMLInputElement.willValidate')
  @DocsEditable
  bool get willValidate native "HTMLInputElement_willValidate_Getter";

  @DomName('HTMLInputElement.checkValidity')
  @DocsEditable
  bool checkValidity() native "HTMLInputElement_checkValidity_Callback";

  @DomName('HTMLInputElement.select')
  @DocsEditable
  void select() native "HTMLInputElement_select_Callback";

  @DomName('HTMLInputElement.setCustomValidity')
  @DocsEditable
  void setCustomValidity(String error) native "HTMLInputElement_setCustomValidity_Callback";

  void setRangeText(String replacement, {int start, int end, String selectionMode}) {
    if ((replacement is String || replacement == null) && !?start && !?end && !?selectionMode) {
      _setRangeText_1(replacement);
      return;
    }
    if ((replacement is String || replacement == null) && (start is int || start == null) && (end is int || end == null) && (selectionMode is String || selectionMode == null)) {
      _setRangeText_2(replacement, start, end, selectionMode);
      return;
    }
    throw new ArgumentError("Incorrect number or type of arguments");
  }

  @DomName('HTMLInputElement._setRangeText_1')
  @DocsEditable
  void _setRangeText_1(replacement) native "HTMLInputElement__setRangeText_1_Callback";

  @DomName('HTMLInputElement._setRangeText_2')
  @DocsEditable
  void _setRangeText_2(replacement, start, end, selectionMode) native "HTMLInputElement__setRangeText_2_Callback";

  @DomName('HTMLInputElement.setSelectionRange')
  @DocsEditable
  void setSelectionRange(int start, int end, [String direction]) native "HTMLInputElement_setSelectionRange_Callback";

  void stepDown([int n]) {
    if (?n) {
      _stepDown_1(n);
      return;
    }
    _stepDown_2();
    return;
  }

  @DomName('HTMLInputElement._stepDown_1')
  @DocsEditable
  void _stepDown_1(n) native "HTMLInputElement__stepDown_1_Callback";

  @DomName('HTMLInputElement._stepDown_2')
  @DocsEditable
  void _stepDown_2() native "HTMLInputElement__stepDown_2_Callback";

  void stepUp([int n]) {
    if (?n) {
      _stepUp_1(n);
      return;
    }
    _stepUp_2();
    return;
  }

  @DomName('HTMLInputElement._stepUp_1')
  @DocsEditable
  void _stepUp_1(n) native "HTMLInputElement__stepUp_1_Callback";

  @DomName('HTMLInputElement._stepUp_2')
  @DocsEditable
  void _stepUp_2() native "HTMLInputElement__stepUp_2_Callback";

  @DomName('HTMLInputElement.onwebkitSpeechChange')
  @DocsEditable
  Stream<Event> get onSpeechChange => speechChangeEvent.forTarget(this);

}


// Interfaces representing the InputElement APIs which are supported
// for the various types of InputElement.
// From http://dev.w3.org/html5/spec/the-input-element.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.validity')
  ValidityState get validity;

  @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 Element {
  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;

  @DomName('HTMLInputElement.files')
  List<File> files;
}

/**
 * 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.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('Int16Array')
class Int16Array extends ArrayBufferView implements List<int> {
  Int16Array.internal() : super.internal();

  @DomName('Int16Array.Int16Array')
  @DocsEditable
  factory Int16Array(int length) =>
    _TypedArrayFactoryProvider.createInt16Array(length);

  @DomName('Int16Array.fromList')
  @DocsEditable
  factory Int16Array.fromList(List<int> list) =>
    _TypedArrayFactoryProvider.createInt16Array_fromList(list);

  @DomName('Int16Array.fromBuffer')
  @DocsEditable
  factory Int16Array.fromBuffer(ArrayBuffer buffer, [int byteOffset, int length]) => 
    _TypedArrayFactoryProvider.createInt16Array_fromBuffer(buffer, byteOffset, length);

  static const int BYTES_PER_ELEMENT = 2;

  @DomName('Int16Array.length')
  @DocsEditable
  int get length native "Int16Array_length_Getter";

  @DomName('Int16Array.numericIndexGetter')
  @DocsEditable
  int operator[](int index) native "Int16Array_numericIndexGetter_Callback";

  @DomName('Int16Array.numericIndexSetter')
  @DocsEditable
  void operator[]=(int index, int value) native "Int16Array_numericIndexSetter_Callback";
  // -- start List<int> mixins.
  // int is the element type.

  // From Iterable<int>:

  Iterator<int> 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<int>(this);
  }

  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, int)) {
    return IterableMixinWorkaround.reduce(this, initialValue, combine);
  }

  bool contains(int element) => IterableMixinWorkaround.contains(this, element);

  void forEach(void f(int element)) => IterableMixinWorkaround.forEach(this, f);

  String join([String separator]) =>
      IterableMixinWorkaround.joinList(this, separator);

  Iterable map(f(int element)) =>
      IterableMixinWorkaround.mapList(this, f);

  Iterable<int> where(bool f(int element)) =>
      IterableMixinWorkaround.where(this, f);

  Iterable expand(Iterable f(int element)) =>
      IterableMixinWorkaround.expand(this, f);

  bool every(bool f(int element)) => IterableMixinWorkaround.every(this, f);

  bool any(bool f(int element)) => IterableMixinWorkaround.any(this, f);

  List<int> toList({ bool growable: true }) =>
      new List<int>.from(this, growable: growable);

  Set<int> toSet() => new Set<int>.from(this);

  bool get isEmpty => this.length == 0;

  Iterable<int> take(int n) => IterableMixinWorkaround.takeList(this, n);

  Iterable<int> takeWhile(bool test(int value)) {
    return IterableMixinWorkaround.takeWhile(this, test);
  }

  Iterable<int> skip(int n) => IterableMixinWorkaround.skipList(this, n);

  Iterable<int> skipWhile(bool test(int value)) {
    return IterableMixinWorkaround.skipWhile(this, test);
  }

  int firstWhere(bool test(int value), { int orElse() }) {
    return IterableMixinWorkaround.firstWhere(this, test, orElse);
  }

  int lastWhere(bool test(int value), {int orElse()}) {
    return IterableMixinWorkaround.lastWhereList(this, test, orElse);
  }

  int singleWhere(bool test(int value)) {
    return IterableMixinWorkaround.singleWhere(this, test);
  }

  int elementAt(int index) {
    return this[index];
  }

  // From Collection<int>:

  void add(int value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(int value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Iterable<int> iterable) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  // From List<int>:
  void set length(int value) {
    throw new UnsupportedError("Cannot resize immutable List.");
  }

  void clear() {
    throw new UnsupportedError("Cannot clear immutable List.");
  }

  Iterable<int> get reversed {
    return IterableMixinWorkaround.reversedList(this);
  }

  void sort([int compare(int a, int b)]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(int element, [int start = 0]) =>
      Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(int element, [int start]) {
    if (start == null) start = length - 1;
    return Lists.lastIndexOf(this, element, start);
  }

  int get first {
    if (this.length > 0) return this[0];
    throw new StateError("No elements");
  }

  int get last {
    if (this.length > 0) return this[this.length - 1];
    throw new StateError("No elements");
  }

  int get single {
    if (length == 1) return this[0];
    if (length == 0) throw new StateError("No elements");
    throw new StateError("More than one element");
  }

  int min([int compare(int a, int b)]) =>
      IterableMixinWorkaround.min(this, compare);

  int max([int compare(int a, int b)]) =>
      IterableMixinWorkaround.max(this, compare);

  void insert(int index, int element) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  int removeAt(int pos) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  int removeLast() {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void remove(Object object) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void removeAll(Iterable elements) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void retainAll(Iterable elements) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void removeWhere(bool test(int element)) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void retainWhere(bool test(int element)) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void setRange(int start, int rangeLength, List<int> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [int initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<int> sublist(int start, [int end]) {
    if (end == null) end = length;
    return Lists.getRange(this, start, end, <int>[]);
  }

  List<int> getRange(int start, int rangeLength) =>
      sublist(start, start + rangeLength);

  Map<int, int> asMap() =>
    IterableMixinWorkaround.asMapList(this);

  // -- end List<int> mixins.

  @DomName('Int16Array.setElements')
  @DocsEditable
  void setElements(Object array, [int offset]) native "Int16Array_setElements_Callback";

  List<int> subarray(int start, [int end]) {
    if (?end) {
      return _subarray_1(start, end);
    }
    return _subarray_2(start);
  }

  @DomName('Int16Array._subarray_1')
  @DocsEditable
  List<int> _subarray_1(start, end) native "Int16Array__subarray_1_Callback";

  @DomName('Int16Array._subarray_2')
  @DocsEditable
  List<int> _subarray_2(start) native "Int16Array__subarray_2_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('Int32Array')
class Int32Array extends ArrayBufferView implements List<int> {
  Int32Array.internal() : super.internal();

  @DomName('Int32Array.Int32Array')
  @DocsEditable
  factory Int32Array(int length) =>
    _TypedArrayFactoryProvider.createInt32Array(length);

  @DomName('Int32Array.fromList')
  @DocsEditable
  factory Int32Array.fromList(List<int> list) =>
    _TypedArrayFactoryProvider.createInt32Array_fromList(list);

  @DomName('Int32Array.fromBuffer')
  @DocsEditable
  factory Int32Array.fromBuffer(ArrayBuffer buffer, [int byteOffset, int length]) => 
    _TypedArrayFactoryProvider.createInt32Array_fromBuffer(buffer, byteOffset, length);

  static const int BYTES_PER_ELEMENT = 4;

  @DomName('Int32Array.length')
  @DocsEditable
  int get length native "Int32Array_length_Getter";

  @DomName('Int32Array.numericIndexGetter')
  @DocsEditable
  int operator[](int index) native "Int32Array_numericIndexGetter_Callback";

  @DomName('Int32Array.numericIndexSetter')
  @DocsEditable
  void operator[]=(int index, int value) native "Int32Array_numericIndexSetter_Callback";
  // -- start List<int> mixins.
  // int is the element type.

  // From Iterable<int>:

  Iterator<int> 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<int>(this);
  }

  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, int)) {
    return IterableMixinWorkaround.reduce(this, initialValue, combine);
  }

  bool contains(int element) => IterableMixinWorkaround.contains(this, element);

  void forEach(void f(int element)) => IterableMixinWorkaround.forEach(this, f);

  String join([String separator]) =>
      IterableMixinWorkaround.joinList(this, separator);

  Iterable map(f(int element)) =>
      IterableMixinWorkaround.mapList(this, f);

  Iterable<int> where(bool f(int element)) =>
      IterableMixinWorkaround.where(this, f);

  Iterable expand(Iterable f(int element)) =>
      IterableMixinWorkaround.expand(this, f);

  bool every(bool f(int element)) => IterableMixinWorkaround.every(this, f);

  bool any(bool f(int element)) => IterableMixinWorkaround.any(this, f);

  List<int> toList({ bool growable: true }) =>
      new List<int>.from(this, growable: growable);

  Set<int> toSet() => new Set<int>.from(this);

  bool get isEmpty => this.length == 0;

  Iterable<int> take(int n) => IterableMixinWorkaround.takeList(this, n);

  Iterable<int> takeWhile(bool test(int value)) {
    return IterableMixinWorkaround.takeWhile(this, test);
  }

  Iterable<int> skip(int n) => IterableMixinWorkaround.skipList(this, n);

  Iterable<int> skipWhile(bool test(int value)) {
    return IterableMixinWorkaround.skipWhile(this, test);
  }

  int firstWhere(bool test(int value), { int orElse() }) {
    return IterableMixinWorkaround.firstWhere(this, test, orElse);
  }

  int lastWhere(bool test(int value), {int orElse()}) {
    return IterableMixinWorkaround.lastWhereList(this, test, orElse);
  }

  int singleWhere(bool test(int value)) {
    return IterableMixinWorkaround.singleWhere(this, test);
  }

  int elementAt(int index) {
    return this[index];
  }

  // From Collection<int>:

  void add(int value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(int value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Iterable<int> iterable) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  // From List<int>:
  void set length(int value) {
    throw new UnsupportedError("Cannot resize immutable List.");
  }

  void clear() {
    throw new UnsupportedError("Cannot clear immutable List.");
  }

  Iterable<int> get reversed {
    return IterableMixinWorkaround.reversedList(this);
  }

  void sort([int compare(int a, int b)]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(int element, [int start = 0]) =>
      Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(int element, [int start]) {
    if (start == null) start = length - 1;
    return Lists.lastIndexOf(this, element, start);
  }

  int get first {
    if (this.length > 0) return this[0];
    throw new StateError("No elements");
  }

  int get last {
    if (this.length > 0) return this[this.length - 1];
    throw new StateError("No elements");
  }

  int get single {
    if (length == 1) return this[0];
    if (length == 0) throw new StateError("No elements");
    throw new StateError("More than one element");
  }

  int min([int compare(int a, int b)]) =>
      IterableMixinWorkaround.min(this, compare);

  int max([int compare(int a, int b)]) =>
      IterableMixinWorkaround.max(this, compare);

  void insert(int index, int element) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  int removeAt(int pos) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  int removeLast() {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void remove(Object object) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void removeAll(Iterable elements) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void retainAll(Iterable elements) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void removeWhere(bool test(int element)) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void retainWhere(bool test(int element)) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void setRange(int start, int rangeLength, List<int> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [int initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<int> sublist(int start, [int end]) {
    if (end == null) end = length;
    return Lists.getRange(this, start, end, <int>[]);
  }

  List<int> getRange(int start, int rangeLength) =>
      sublist(start, start + rangeLength);

  Map<int, int> asMap() =>
    IterableMixinWorkaround.asMapList(this);

  // -- end List<int> mixins.

  @DomName('Int32Array.setElements')
  @DocsEditable
  void setElements(Object array, [int offset]) native "Int32Array_setElements_Callback";

  List<int> subarray(int start, [int end]) {
    if (?end) {
      return _subarray_1(start, end);
    }
    return _subarray_2(start);
  }

  @DomName('Int32Array._subarray_1')
  @DocsEditable
  List<int> _subarray_1(start, end) native "Int32Array__subarray_1_Callback";

  @DomName('Int32Array._subarray_2')
  @DocsEditable
  List<int> _subarray_2(start) native "Int32Array__subarray_2_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('Int8Array')
class Int8Array extends ArrayBufferView implements List<int> {
  Int8Array.internal() : super.internal();

  @DomName('Int8Array.Int8Array')
  @DocsEditable
  factory Int8Array(int length) =>
    _TypedArrayFactoryProvider.createInt8Array(length);

  @DomName('Int8Array.fromList')
  @DocsEditable
  factory Int8Array.fromList(List<int> list) =>
    _TypedArrayFactoryProvider.createInt8Array_fromList(list);

  @DomName('Int8Array.fromBuffer')
  @DocsEditable
  factory Int8Array.fromBuffer(ArrayBuffer buffer, [int byteOffset, int length]) => 
    _TypedArrayFactoryProvider.createInt8Array_fromBuffer(buffer, byteOffset, length);

  static const int BYTES_PER_ELEMENT = 1;

  @DomName('Int8Array.length')
  @DocsEditable
  int get length native "Int8Array_length_Getter";

  @DomName('Int8Array.numericIndexGetter')
  @DocsEditable
  int operator[](int index) native "Int8Array_numericIndexGetter_Callback";

  @DomName('Int8Array.numericIndexSetter')
  @DocsEditable
  void operator[]=(int index, int value) native "Int8Array_numericIndexSetter_Callback";
  // -- start List<int> mixins.
  // int is the element type.

  // From Iterable<int>:

  Iterator<int> 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<int>(this);
  }

  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, int)) {
    return IterableMixinWorkaround.reduce(this, initialValue, combine);
  }

  bool contains(int element) => IterableMixinWorkaround.contains(this, element);

  void forEach(void f(int element)) => IterableMixinWorkaround.forEach(this, f);

  String join([String separator]) =>
      IterableMixinWorkaround.joinList(this, separator);

  Iterable map(f(int element)) =>
      IterableMixinWorkaround.mapList(this, f);

  Iterable<int> where(bool f(int element)) =>
      IterableMixinWorkaround.where(this, f);

  Iterable expand(Iterable f(int element)) =>
      IterableMixinWorkaround.expand(this, f);

  bool every(bool f(int element)) => IterableMixinWorkaround.every(this, f);

  bool any(bool f(int element)) => IterableMixinWorkaround.any(this, f);

  List<int> toList({ bool growable: true }) =>
      new List<int>.from(this, growable: growable);

  Set<int> toSet() => new Set<int>.from(this);

  bool get isEmpty => this.length == 0;

  Iterable<int> take(int n) => IterableMixinWorkaround.takeList(this, n);

  Iterable<int> takeWhile(bool test(int value)) {
    return IterableMixinWorkaround.takeWhile(this, test);
  }

  Iterable<int> skip(int n) => IterableMixinWorkaround.skipList(this, n);

  Iterable<int> skipWhile(bool test(int value)) {
    return IterableMixinWorkaround.skipWhile(this, test);
  }

  int firstWhere(bool test(int value), { int orElse() }) {
    return IterableMixinWorkaround.firstWhere(this, test, orElse);
  }

  int lastWhere(bool test(int value), {int orElse()}) {
    return IterableMixinWorkaround.lastWhereList(this, test, orElse);
  }

  int singleWhere(bool test(int value)) {
    return IterableMixinWorkaround.singleWhere(this, test);
  }

  int elementAt(int index) {
    return this[index];
  }

  // From Collection<int>:

  void add(int value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(int value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Iterable<int> iterable) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  // From List<int>:
  void set length(int value) {
    throw new UnsupportedError("Cannot resize immutable List.");
  }

  void clear() {
    throw new UnsupportedError("Cannot clear immutable List.");
  }

  Iterable<int> get reversed {
    return IterableMixinWorkaround.reversedList(this);
  }

  void sort([int compare(int a, int b)]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(int element, [int start = 0]) =>
      Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(int element, [int start]) {
    if (start == null) start = length - 1;
    return Lists.lastIndexOf(this, element, start);
  }

  int get first {
    if (this.length > 0) return this[0];
    throw new StateError("No elements");
  }

  int get last {
    if (this.length > 0) return this[this.length - 1];
    throw new StateError("No elements");
  }

  int get single {
    if (length == 1) return this[0];
    if (length == 0) throw new StateError("No elements");
    throw new StateError("More than one element");
  }

  int min([int compare(int a, int b)]) =>
      IterableMixinWorkaround.min(this, compare);

  int max([int compare(int a, int b)]) =>
      IterableMixinWorkaround.max(this, compare);

  void insert(int index, int element) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  int removeAt(int pos) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  int removeLast() {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void remove(Object object) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void removeAll(Iterable elements) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void retainAll(Iterable elements) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void removeWhere(bool test(int element)) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void retainWhere(bool test(int element)) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void setRange(int start, int rangeLength, List<int> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [int initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<int> sublist(int start, [int end]) {
    if (end == null) end = length;
    return Lists.getRange(this, start, end, <int>[]);
  }

  List<int> getRange(int start, int rangeLength) =>
      sublist(start, start + rangeLength);

  Map<int, int> asMap() =>
    IterableMixinWorkaround.asMapList(this);

  // -- end List<int> mixins.

  @DomName('Int8Array.setElements')
  @DocsEditable
  void setElements(Object array, [int offset]) native "Int8Array_setElements_Callback";

  List<int> subarray(int start, [int end]) {
    if (?end) {
      return _subarray_1(start, end);
    }
    return _subarray_2(start);
  }

  @DomName('Int8Array._subarray_1')
  @DocsEditable
  List<int> _subarray_1(start, end) native "Int8Array__subarray_1_Callback";

  @DomName('Int8Array._subarray_2')
  @DocsEditable
  List<int> _subarray_2(start) native "Int8Array__subarray_2_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('JavaScriptCallFrame')
class JavaScriptCallFrame extends NativeFieldWrapperClass1 {
  JavaScriptCallFrame.internal();

  static const int CATCH_SCOPE = 4;

  static const int CLOSURE_SCOPE = 3;

  static const int GLOBAL_SCOPE = 0;

  static const int LOCAL_SCOPE = 1;

  static const int WITH_SCOPE = 2;

  @DomName('JavaScriptCallFrame.caller')
  @DocsEditable
  JavaScriptCallFrame get caller native "JavaScriptCallFrame_caller_Getter";

  @DomName('JavaScriptCallFrame.column')
  @DocsEditable
  int get column native "JavaScriptCallFrame_column_Getter";

  @DomName('JavaScriptCallFrame.functionName')
  @DocsEditable
  String get functionName native "JavaScriptCallFrame_functionName_Getter";

  @DomName('JavaScriptCallFrame.line')
  @DocsEditable
  int get line native "JavaScriptCallFrame_line_Getter";

  @DomName('JavaScriptCallFrame.scopeChain')
  @DocsEditable
  List get scopeChain native "JavaScriptCallFrame_scopeChain_Getter";

  @DomName('JavaScriptCallFrame.sourceID')
  @DocsEditable
  int get sourceID native "JavaScriptCallFrame_sourceID_Getter";

  @DomName('JavaScriptCallFrame.thisObject')
  @DocsEditable
  Object get thisObject native "JavaScriptCallFrame_thisObject_Getter";

  @DomName('JavaScriptCallFrame.type')
  @DocsEditable
  String get type native "JavaScriptCallFrame_type_Getter";

  @DomName('JavaScriptCallFrame.evaluate')
  @DocsEditable
  void evaluate(String script) native "JavaScriptCallFrame_evaluate_Callback";

  @DomName('JavaScriptCallFrame.restart')
  @DocsEditable
  Object restart() native "JavaScriptCallFrame_restart_Callback";

  @DomName('JavaScriptCallFrame.scopeType')
  @DocsEditable
  int scopeType(int scopeIndex) native "JavaScriptCallFrame_scopeType_Callback";

  @DomName('JavaScriptCallFrame.setVariableValue')
  @DocsEditable
  Object setVariableValue(int scopeIndex, String variableName, Object newValue) native "JavaScriptCallFrame_setVariableValue_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.


@DomName('KeyboardEvent')
class KeyboardEvent extends UIEvent {

  factory KeyboardEvent(String type,
      {Window view, bool canBubble: true, bool cancelable: true,
      String keyIdentifier: "", int keyLocation: 1, bool ctrlKey: false,
      bool altKey: false, bool shiftKey: false, bool metaKey: false,
      bool altGraphKey: false}) {
    if (view == null) {
      view = window;
    }
    final e = document.$dom_createEvent("KeyboardEvent");
    e.$dom_initKeyboardEvent(type, canBubble, cancelable, view, keyIdentifier,
        keyLocation, ctrlKey, altKey, shiftKey, metaKey, altGraphKey);
    return e;
  }

  @DomName('KeyboardEvent.keyCode')
  int get keyCode => $dom_keyCode;

  @DomName('KeyboardEvent.charCode')
  int get charCode => $dom_charCode;
  KeyboardEvent.internal() : super.internal();

  @DomName('KeyboardEvent.altGraphKey')
  @DocsEditable
  bool get altGraphKey native "KeyboardEvent_altGraphKey_Getter";

  @DomName('KeyboardEvent.altKey')
  @DocsEditable
  bool get altKey native "KeyboardEvent_altKey_Getter";

  @DomName('KeyboardEvent.ctrlKey')
  @DocsEditable
  bool get ctrlKey native "KeyboardEvent_ctrlKey_Getter";

  @DomName('KeyboardEvent.keyIdentifier')
  @DocsEditable
  String get $dom_keyIdentifier native "KeyboardEvent_keyIdentifier_Getter";

  @DomName('KeyboardEvent.keyLocation')
  @DocsEditable
  int get keyLocation native "KeyboardEvent_keyLocation_Getter";

  @DomName('KeyboardEvent.metaKey')
  @DocsEditable
  bool get metaKey native "KeyboardEvent_metaKey_Getter";

  @DomName('KeyboardEvent.shiftKey')
  @DocsEditable
  bool get shiftKey native "KeyboardEvent_shiftKey_Getter";

  @DomName('KeyboardEvent.initKeyboardEvent')
  @DocsEditable
  void $dom_initKeyboardEvent(String type, bool canBubble, bool cancelable, Window view, String keyIdentifier, int keyLocation, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey, bool altGraphKey) native "KeyboardEvent_initKeyboardEvent_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('HTMLKeygenElement')
@SupportedBrowser(SupportedBrowser.CHROME)
@SupportedBrowser(SupportedBrowser.SAFARI)
@Experimental
class KeygenElement extends _Element_Merged {
  KeygenElement.internal() : super.internal();

  @DomName('HTMLKeygenElement.HTMLKeygenElement')
  @DocsEditable
  factory KeygenElement() => document.$dom_createElement("keygen");

  /// Checks if this type is supported on the current platform.
  static bool get supported => true;

  @DomName('HTMLKeygenElement.autofocus')
  @DocsEditable
  bool get autofocus native "HTMLKeygenElement_autofocus_Getter";

  @DomName('HTMLKeygenElement.autofocus')
  @DocsEditable
  void set autofocus(bool value) native "HTMLKeygenElement_autofocus_Setter";

  @DomName('HTMLKeygenElement.challenge')
  @DocsEditable
  String get challenge native "HTMLKeygenElement_challenge_Getter";

  @DomName('HTMLKeygenElement.challenge')
  @DocsEditable
  void set challenge(String value) native "HTMLKeygenElement_challenge_Setter";

  @DomName('HTMLKeygenElement.disabled')
  @DocsEditable
  bool get disabled native "HTMLKeygenElement_disabled_Getter";

  @DomName('HTMLKeygenElement.disabled')
  @DocsEditable
  void set disabled(bool value) native "HTMLKeygenElement_disabled_Setter";

  @DomName('HTMLKeygenElement.form')
  @DocsEditable
  FormElement get form native "HTMLKeygenElement_form_Getter";

  @DomName('HTMLKeygenElement.keytype')
  @DocsEditable
  String get keytype native "HTMLKeygenElement_keytype_Getter";

  @DomName('HTMLKeygenElement.keytype')
  @DocsEditable
  void set keytype(String value) native "HTMLKeygenElement_keytype_Setter";

  @DomName('HTMLKeygenElement.labels')
  @DocsEditable
  List<Node> get labels native "HTMLKeygenElement_labels_Getter";

  @DomName('HTMLKeygenElement.name')
  @DocsEditable
  String get name native "HTMLKeygenElement_name_Getter";

  @DomName('HTMLKeygenElement.name')
  @DocsEditable
  void set name(String value) native "HTMLKeygenElement_name_Setter";

  @DomName('HTMLKeygenElement.type')
  @DocsEditable
  String get type native "HTMLKeygenElement_type_Getter";

  @DomName('HTMLKeygenElement.validationMessage')
  @DocsEditable
  String get validationMessage native "HTMLKeygenElement_validationMessage_Getter";

  @DomName('HTMLKeygenElement.validity')
  @DocsEditable
  ValidityState get validity native "HTMLKeygenElement_validity_Getter";

  @DomName('HTMLKeygenElement.willValidate')
  @DocsEditable
  bool get willValidate native "HTMLKeygenElement_willValidate_Getter";

  @DomName('HTMLKeygenElement.checkValidity')
  @DocsEditable
  bool checkValidity() native "HTMLKeygenElement_checkValidity_Callback";

  @DomName('HTMLKeygenElement.setCustomValidity')
  @DocsEditable
  void setCustomValidity(String error) native "HTMLKeygenElement_setCustomValidity_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('HTMLLIElement')
class LIElement extends _Element_Merged {
  LIElement.internal() : super.internal();

  @DomName('HTMLLIElement.HTMLLIElement')
  @DocsEditable
  factory LIElement() => document.$dom_createElement("li");

  @DomName('HTMLLIElement.type')
  @DocsEditable
  String get type native "HTMLLIElement_type_Getter";

  @DomName('HTMLLIElement.type')
  @DocsEditable
  void set type(String value) native "HTMLLIElement_type_Setter";

  @DomName('HTMLLIElement.value')
  @DocsEditable
  int get value native "HTMLLIElement_value_Getter";

  @DomName('HTMLLIElement.value')
  @DocsEditable
  void set value(int value) native "HTMLLIElement_value_Setter";

}
// 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.


@DocsEditable
@DomName('HTMLLabelElement')
class LabelElement extends _Element_Merged {
  LabelElement.internal() : super.internal();

  @DomName('HTMLLabelElement.HTMLLabelElement')
  @DocsEditable
  factory LabelElement() => document.$dom_createElement("label");

  @DomName('HTMLLabelElement.control')
  @DocsEditable
  Element get control native "HTMLLabelElement_control_Getter";

  @DomName('HTMLLabelElement.form')
  @DocsEditable
  FormElement get form native "HTMLLabelElement_form_Getter";

  @DomName('HTMLLabelElement.htmlFor')
  @DocsEditable
  String get htmlFor native "HTMLLabelElement_htmlFor_Getter";

  @DomName('HTMLLabelElement.htmlFor')
  @DocsEditable
  void set htmlFor(String value) native "HTMLLabelElement_htmlFor_Setter";

}
// 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.


@DocsEditable
@DomName('HTMLLegendElement')
class LegendElement extends _Element_Merged {
  LegendElement.internal() : super.internal();

  @DomName('HTMLLegendElement.HTMLLegendElement')
  @DocsEditable
  factory LegendElement() => document.$dom_createElement("legend");

  @DomName('HTMLLegendElement.form')
  @DocsEditable
  FormElement get form native "HTMLLegendElement_form_Getter";

}
// 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.


@DocsEditable
@DomName('HTMLLinkElement')
class LinkElement extends _Element_Merged {
  LinkElement.internal() : super.internal();

  @DomName('HTMLLinkElement.HTMLLinkElement')
  @DocsEditable
  factory LinkElement() => document.$dom_createElement("link");

  @DomName('HTMLLinkElement.disabled')
  @DocsEditable
  bool get disabled native "HTMLLinkElement_disabled_Getter";

  @DomName('HTMLLinkElement.disabled')
  @DocsEditable
  void set disabled(bool value) native "HTMLLinkElement_disabled_Setter";

  @DomName('HTMLLinkElement.href')
  @DocsEditable
  String get href native "HTMLLinkElement_href_Getter";

  @DomName('HTMLLinkElement.href')
  @DocsEditable
  void set href(String value) native "HTMLLinkElement_href_Setter";

  @DomName('HTMLLinkElement.hreflang')
  @DocsEditable
  String get hreflang native "HTMLLinkElement_hreflang_Getter";

  @DomName('HTMLLinkElement.hreflang')
  @DocsEditable
  void set hreflang(String value) native "HTMLLinkElement_hreflang_Setter";

  @DomName('HTMLLinkElement.media')
  @DocsEditable
  String get media native "HTMLLinkElement_media_Getter";

  @DomName('HTMLLinkElement.media')
  @DocsEditable
  void set media(String value) native "HTMLLinkElement_media_Setter";

  @DomName('HTMLLinkElement.rel')
  @DocsEditable
  String get rel native "HTMLLinkElement_rel_Getter";

  @DomName('HTMLLinkElement.rel')
  @DocsEditable
  void set rel(String value) native "HTMLLinkElement_rel_Setter";

  @DomName('HTMLLinkElement.sheet')
  @DocsEditable
  StyleSheet get sheet native "HTMLLinkElement_sheet_Getter";

  @DomName('HTMLLinkElement.sizes')
  @DocsEditable
  DomSettableTokenList get sizes native "HTMLLinkElement_sizes_Getter";

  @DomName('HTMLLinkElement.sizes')
  @DocsEditable
  void set sizes(DomSettableTokenList value) native "HTMLLinkElement_sizes_Setter";

  @DomName('HTMLLinkElement.type')
  @DocsEditable
  String get type native "HTMLLinkElement_type_Getter";

  @DomName('HTMLLinkElement.type')
  @DocsEditable
  void set type(String value) native "HTMLLinkElement_type_Setter";

}
// 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.


@DocsEditable
@DomName('LocalMediaStream')
@SupportedBrowser(SupportedBrowser.CHROME)
@Experimental
class LocalMediaStream extends MediaStream implements EventTarget {
  LocalMediaStream.internal() : super.internal();

  @DomName('LocalMediaStream.stop')
  @DocsEditable
  void stop() native "LocalMediaStream_stop_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('Location')
class Location extends NativeFieldWrapperClass1 implements LocationBase {
  Location.internal();

  @DomName('Location.ancestorOrigins')
  @DocsEditable
  List<String> get ancestorOrigins native "Location_ancestorOrigins_Getter";

  @DomName('Location.hash')
  @DocsEditable
  String get hash native "Location_hash_Getter";

  @DomName('Location.hash')
  @DocsEditable
  void set hash(String value) native "Location_hash_Setter";

  @DomName('Location.host')
  @DocsEditable
  String get host native "Location_host_Getter";

  @DomName('Location.host')
  @DocsEditable
  void set host(String value) native "Location_host_Setter";

  @DomName('Location.hostname')
  @DocsEditable
  String get hostname native "Location_hostname_Getter";

  @DomName('Location.hostname')
  @DocsEditable
  void set hostname(String value) native "Location_hostname_Setter";

  @DomName('Location.href')
  @DocsEditable
  String get href native "Location_href_Getter";

  @DomName('Location.href')
  @DocsEditable
  void set href(String value) native "Location_href_Setter";

  @DomName('Location.origin')
  @DocsEditable
  String get origin native "Location_origin_Getter";

  @DomName('Location.pathname')
  @DocsEditable
  String get pathname native "Location_pathname_Getter";

  @DomName('Location.pathname')
  @DocsEditable
  void set pathname(String value) native "Location_pathname_Setter";

  @DomName('Location.port')
  @DocsEditable
  String get port native "Location_port_Getter";

  @DomName('Location.port')
  @DocsEditable
  void set port(String value) native "Location_port_Setter";

  @DomName('Location.protocol')
  @DocsEditable
  String get protocol native "Location_protocol_Getter";

  @DomName('Location.protocol')
  @DocsEditable
  void set protocol(String value) native "Location_protocol_Setter";

  @DomName('Location.search')
  @DocsEditable
  String get search native "Location_search_Getter";

  @DomName('Location.search')
  @DocsEditable
  void set search(String value) native "Location_search_Setter";

  @DomName('Location.assign')
  @DocsEditable
  void assign(String url) native "Location_assign_Callback";

  @DomName('Location.reload')
  @DocsEditable
  void reload() native "Location_reload_Callback";

  @DomName('Location.replace')
  @DocsEditable
  void replace(String url) native "Location_replace_Callback";

  @DomName('Location.toString')
  @DocsEditable
  String toString() native "Location_toString_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('HTMLMapElement')
class MapElement extends _Element_Merged {
  MapElement.internal() : super.internal();

  @DomName('HTMLMapElement.HTMLMapElement')
  @DocsEditable
  factory MapElement() => document.$dom_createElement("map");

  @DomName('HTMLMapElement.areas')
  @DocsEditable
  HtmlCollection get areas native "HTMLMapElement_areas_Getter";

  @DomName('HTMLMapElement.name')
  @DocsEditable
  String get name native "HTMLMapElement_name_Getter";

  @DomName('HTMLMapElement.name')
  @DocsEditable
  void set name(String value) native "HTMLMapElement_name_Setter";

}
// 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.


@DocsEditable
@DomName('MediaController')
class MediaController extends EventTarget {
  MediaController.internal() : super.internal();

  @DomName('MediaController.MediaController')
  @DocsEditable
  factory MediaController() {
    return MediaController._create_1();
  }

  @DocsEditable
  static MediaController _create_1() native "MediaController__create_1constructorCallback";

  @DomName('MediaController.buffered')
  @DocsEditable
  TimeRanges get buffered native "MediaController_buffered_Getter";

  @DomName('MediaController.currentTime')
  @DocsEditable
  num get currentTime native "MediaController_currentTime_Getter";

  @DomName('MediaController.currentTime')
  @DocsEditable
  void set currentTime(num value) native "MediaController_currentTime_Setter";

  @DomName('MediaController.defaultPlaybackRate')
  @DocsEditable
  num get defaultPlaybackRate native "MediaController_defaultPlaybackRate_Getter";

  @DomName('MediaController.defaultPlaybackRate')
  @DocsEditable
  void set defaultPlaybackRate(num value) native "MediaController_defaultPlaybackRate_Setter";

  @DomName('MediaController.duration')
  @DocsEditable
  num get duration native "MediaController_duration_Getter";

  @DomName('MediaController.muted')
  @DocsEditable
  bool get muted native "MediaController_muted_Getter";

  @DomName('MediaController.muted')
  @DocsEditable
  void set muted(bool value) native "MediaController_muted_Setter";

  @DomName('MediaController.paused')
  @DocsEditable
  bool get paused native "MediaController_paused_Getter";

  @DomName('MediaController.playbackRate')
  @DocsEditable
  num get playbackRate native "MediaController_playbackRate_Getter";

  @DomName('MediaController.playbackRate')
  @DocsEditable
  void set playbackRate(num value) native "MediaController_playbackRate_Setter";

  @DomName('MediaController.playbackState')
  @DocsEditable
  String get playbackState native "MediaController_playbackState_Getter";

  @DomName('MediaController.played')
  @DocsEditable
  TimeRanges get played native "MediaController_played_Getter";

  @DomName('MediaController.seekable')
  @DocsEditable
  TimeRanges get seekable native "MediaController_seekable_Getter";

  @DomName('MediaController.volume')
  @DocsEditable
  num get volume native "MediaController_volume_Getter";

  @DomName('MediaController.volume')
  @DocsEditable
  void set volume(num value) native "MediaController_volume_Setter";

  @DomName('MediaController.addEventListener')
  @DocsEditable
  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "MediaController_addEventListener_Callback";

  @DomName('MediaController.dispatchEvent')
  @DocsEditable
  bool dispatchEvent(Event evt) native "MediaController_dispatchEvent_Callback";

  @DomName('MediaController.pause')
  @DocsEditable
  void pause() native "MediaController_pause_Callback";

  @DomName('MediaController.play')
  @DocsEditable
  void play() native "MediaController_play_Callback";

  @DomName('MediaController.removeEventListener')
  @DocsEditable
  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "MediaController_removeEventListener_Callback";

  @DomName('MediaController.unpause')
  @DocsEditable
  void unpause() native "MediaController_unpause_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('HTMLMediaElement')
class MediaElement extends _Element_Merged {
  MediaElement.internal() : super.internal();

  @DomName('HTMLMediaElement.canplayEvent')
  @DocsEditable
  static const EventStreamProvider<Event> canPlayEvent = const EventStreamProvider<Event>('canplay');

  @DomName('HTMLMediaElement.canplaythroughEvent')
  @DocsEditable
  static const EventStreamProvider<Event> canPlayThroughEvent = const EventStreamProvider<Event>('canplaythrough');

  @DomName('HTMLMediaElement.durationchangeEvent')
  @DocsEditable
  static const EventStreamProvider<Event> durationChangeEvent = const EventStreamProvider<Event>('durationchange');

  @DomName('HTMLMediaElement.emptiedEvent')
  @DocsEditable
  static const EventStreamProvider<Event> emptiedEvent = const EventStreamProvider<Event>('emptied');

  @DomName('HTMLMediaElement.endedEvent')
  @DocsEditable
  static const EventStreamProvider<Event> endedEvent = const EventStreamProvider<Event>('ended');

  @DomName('HTMLMediaElement.loadeddataEvent')
  @DocsEditable
  static const EventStreamProvider<Event> loadedDataEvent = const EventStreamProvider<Event>('loadeddata');

  @DomName('HTMLMediaElement.loadedmetadataEvent')
  @DocsEditable
  static const EventStreamProvider<Event> loadedMetadataEvent = const EventStreamProvider<Event>('loadedmetadata');

  @DomName('HTMLMediaElement.loadstartEvent')
  @DocsEditable
  static const EventStreamProvider<Event> loadStartEvent = const EventStreamProvider<Event>('loadstart');

  @DomName('HTMLMediaElement.pauseEvent')
  @DocsEditable
  static const EventStreamProvider<Event> pauseEvent = const EventStreamProvider<Event>('pause');

  @DomName('HTMLMediaElement.playEvent')
  @DocsEditable
  static const EventStreamProvider<Event> playEvent = const EventStreamProvider<Event>('play');

  @DomName('HTMLMediaElement.playingEvent')
  @DocsEditable
  static const EventStreamProvider<Event> playingEvent = const EventStreamProvider<Event>('playing');

  @DomName('HTMLMediaElement.progressEvent')
  @DocsEditable
  static const EventStreamProvider<Event> progressEvent = const EventStreamProvider<Event>('progress');

  @DomName('HTMLMediaElement.ratechangeEvent')
  @DocsEditable
  static const EventStreamProvider<Event> rateChangeEvent = const EventStreamProvider<Event>('ratechange');

  @DomName('HTMLMediaElement.seekedEvent')
  @DocsEditable
  static const EventStreamProvider<Event> seekedEvent = const EventStreamProvider<Event>('seeked');

  @DomName('HTMLMediaElement.seekingEvent')
  @DocsEditable
  static const EventStreamProvider<Event> seekingEvent = const EventStreamProvider<Event>('seeking');

  @DomName('HTMLMediaElement.showEvent')
  @DocsEditable
  static const EventStreamProvider<Event> showEvent = const EventStreamProvider<Event>('show');

  @DomName('HTMLMediaElement.stalledEvent')
  @DocsEditable
  static const EventStreamProvider<Event> stalledEvent = const EventStreamProvider<Event>('stalled');

  @DomName('HTMLMediaElement.suspendEvent')
  @DocsEditable
  static const EventStreamProvider<Event> suspendEvent = const EventStreamProvider<Event>('suspend');

  @DomName('HTMLMediaElement.timeupdateEvent')
  @DocsEditable
  static const EventStreamProvider<Event> timeUpdateEvent = const EventStreamProvider<Event>('timeupdate');

  @DomName('HTMLMediaElement.volumechangeEvent')
  @DocsEditable
  static const EventStreamProvider<Event> volumeChangeEvent = const EventStreamProvider<Event>('volumechange');

  @DomName('HTMLMediaElement.waitingEvent')
  @DocsEditable
  static const EventStreamProvider<Event> waitingEvent = const EventStreamProvider<Event>('waiting');

  @DomName('HTMLMediaElement.webkitkeyaddedEvent')
  @DocsEditable
  @SupportedBrowser(SupportedBrowser.CHROME)
  @SupportedBrowser(SupportedBrowser.SAFARI)
  @Experimental
  static const EventStreamProvider<MediaKeyEvent> keyAddedEvent = const EventStreamProvider<MediaKeyEvent>('webkitkeyadded');

  @DomName('HTMLMediaElement.webkitkeyerrorEvent')
  @DocsEditable
  @SupportedBrowser(SupportedBrowser.CHROME)
  @SupportedBrowser(SupportedBrowser.SAFARI)
  @Experimental
  static const EventStreamProvider<MediaKeyEvent> keyErrorEvent = const EventStreamProvider<MediaKeyEvent>('webkitkeyerror');

  @DomName('HTMLMediaElement.webkitkeymessageEvent')
  @DocsEditable
  @SupportedBrowser(SupportedBrowser.CHROME)
  @SupportedBrowser(SupportedBrowser.SAFARI)
  @Experimental
  static const EventStreamProvider<MediaKeyEvent> keyMessageEvent = const EventStreamProvider<MediaKeyEvent>('webkitkeymessage');

  @DomName('HTMLMediaElement.webkitneedkeyEvent')
  @DocsEditable
  @SupportedBrowser(SupportedBrowser.CHROME)
  @SupportedBrowser(SupportedBrowser.SAFARI)
  @Experimental
  static const EventStreamProvider<MediaKeyEvent> needKeyEvent = const EventStreamProvider<MediaKeyEvent>('webkitneedkey');

  static const int HAVE_CURRENT_DATA = 2;

  static const int HAVE_ENOUGH_DATA = 4;

  static const int HAVE_FUTURE_DATA = 3;

  static const int HAVE_METADATA = 1;

  static const int HAVE_NOTHING = 0;

  static const int NETWORK_EMPTY = 0;

  static const int NETWORK_IDLE = 1;

  static const int NETWORK_LOADING = 2;

  static const int NETWORK_NO_SOURCE = 3;

  @DomName('HTMLMediaElement.autoplay')
  @DocsEditable
  bool get autoplay native "HTMLMediaElement_autoplay_Getter";

  @DomName('HTMLMediaElement.autoplay')
  @DocsEditable
  void set autoplay(bool value) native "HTMLMediaElement_autoplay_Setter";

  @DomName('HTMLMediaElement.buffered')
  @DocsEditable
  TimeRanges get buffered native "HTMLMediaElement_buffered_Getter";

  @DomName('HTMLMediaElement.controller')
  @DocsEditable
  MediaController get controller native "HTMLMediaElement_controller_Getter";

  @DomName('HTMLMediaElement.controller')
  @DocsEditable
  void set controller(MediaController value) native "HTMLMediaElement_controller_Setter";

  @DomName('HTMLMediaElement.controls')
  @DocsEditable
  bool get controls native "HTMLMediaElement_controls_Getter";

  @DomName('HTMLMediaElement.controls')
  @DocsEditable
  void set controls(bool value) native "HTMLMediaElement_controls_Setter";

  @DomName('HTMLMediaElement.currentSrc')
  @DocsEditable
  String get currentSrc native "HTMLMediaElement_currentSrc_Getter";

  @DomName('HTMLMediaElement.currentTime')
  @DocsEditable
  num get currentTime native "HTMLMediaElement_currentTime_Getter";

  @DomName('HTMLMediaElement.currentTime')
  @DocsEditable
  void set currentTime(num value) native "HTMLMediaElement_currentTime_Setter";

  @DomName('HTMLMediaElement.defaultMuted')
  @DocsEditable
  bool get defaultMuted native "HTMLMediaElement_defaultMuted_Getter";

  @DomName('HTMLMediaElement.defaultMuted')
  @DocsEditable
  void set defaultMuted(bool value) native "HTMLMediaElement_defaultMuted_Setter";

  @DomName('HTMLMediaElement.defaultPlaybackRate')
  @DocsEditable
  num get defaultPlaybackRate native "HTMLMediaElement_defaultPlaybackRate_Getter";

  @DomName('HTMLMediaElement.defaultPlaybackRate')
  @DocsEditable
  void set defaultPlaybackRate(num value) native "HTMLMediaElement_defaultPlaybackRate_Setter";

  @DomName('HTMLMediaElement.duration')
  @DocsEditable
  num get duration native "HTMLMediaElement_duration_Getter";

  @DomName('HTMLMediaElement.ended')
  @DocsEditable
  bool get ended native "HTMLMediaElement_ended_Getter";

  @DomName('HTMLMediaElement.error')
  @DocsEditable
  MediaError get error native "HTMLMediaElement_error_Getter";

  @DomName('HTMLMediaElement.initialTime')
  @DocsEditable
  num get initialTime native "HTMLMediaElement_initialTime_Getter";

  @DomName('HTMLMediaElement.loop')
  @DocsEditable
  bool get loop native "HTMLMediaElement_loop_Getter";

  @DomName('HTMLMediaElement.loop')
  @DocsEditable
  void set loop(bool value) native "HTMLMediaElement_loop_Setter";

  @DomName('HTMLMediaElement.mediaGroup')
  @DocsEditable
  String get mediaGroup native "HTMLMediaElement_mediaGroup_Getter";

  @DomName('HTMLMediaElement.mediaGroup')
  @DocsEditable
  void set mediaGroup(String value) native "HTMLMediaElement_mediaGroup_Setter";

  @DomName('HTMLMediaElement.muted')
  @DocsEditable
  bool get muted native "HTMLMediaElement_muted_Getter";

  @DomName('HTMLMediaElement.muted')
  @DocsEditable
  void set muted(bool value) native "HTMLMediaElement_muted_Setter";

  @DomName('HTMLMediaElement.networkState')
  @DocsEditable
  int get networkState native "HTMLMediaElement_networkState_Getter";

  @DomName('HTMLMediaElement.paused')
  @DocsEditable
  bool get paused native "HTMLMediaElement_paused_Getter";

  @DomName('HTMLMediaElement.playbackRate')
  @DocsEditable
  num get playbackRate native "HTMLMediaElement_playbackRate_Getter";

  @DomName('HTMLMediaElement.playbackRate')
  @DocsEditable
  void set playbackRate(num value) native "HTMLMediaElement_playbackRate_Setter";

  @DomName('HTMLMediaElement.played')
  @DocsEditable
  TimeRanges get played native "HTMLMediaElement_played_Getter";

  @DomName('HTMLMediaElement.preload')
  @DocsEditable
  String get preload native "HTMLMediaElement_preload_Getter";

  @DomName('HTMLMediaElement.preload')
  @DocsEditable
  void set preload(String value) native "HTMLMediaElement_preload_Setter";

  @DomName('HTMLMediaElement.readyState')
  @DocsEditable
  int get readyState native "HTMLMediaElement_readyState_Getter";

  @DomName('HTMLMediaElement.seekable')
  @DocsEditable
  TimeRanges get seekable native "HTMLMediaElement_seekable_Getter";

  @DomName('HTMLMediaElement.seeking')
  @DocsEditable
  bool get seeking native "HTMLMediaElement_seeking_Getter";

  @DomName('HTMLMediaElement.src')
  @DocsEditable
  String get src native "HTMLMediaElement_src_Getter";

  @DomName('HTMLMediaElement.src')
  @DocsEditable
  void set src(String value) native "HTMLMediaElement_src_Setter";

  @DomName('HTMLMediaElement.startTime')
  @DocsEditable
  num get startTime native "HTMLMediaElement_startTime_Getter";

  @DomName('HTMLMediaElement.textTracks')
  @DocsEditable
  TextTrackList get textTracks native "HTMLMediaElement_textTracks_Getter";

  @DomName('HTMLMediaElement.volume')
  @DocsEditable
  num get volume native "HTMLMediaElement_volume_Getter";

  @DomName('HTMLMediaElement.volume')
  @DocsEditable
  void set volume(num value) native "HTMLMediaElement_volume_Setter";

  @DomName('HTMLMediaElement.webkitAudioDecodedByteCount')
  @DocsEditable
  @SupportedBrowser(SupportedBrowser.CHROME)
  @SupportedBrowser(SupportedBrowser.SAFARI)
  @Experimental
  int get audioDecodedByteCount native "HTMLMediaElement_webkitAudioDecodedByteCount_Getter";

  @DomName('HTMLMediaElement.webkitClosedCaptionsVisible')
  @DocsEditable
  @SupportedBrowser(SupportedBrowser.CHROME)
  @SupportedBrowser(SupportedBrowser.SAFARI)
  @Experimental
  bool get closedCaptionsVisible native "HTMLMediaElement_webkitClosedCaptionsVisible_Getter";

  @DomName('HTMLMediaElement.webkitClosedCaptionsVisible')
  @DocsEditable
  @SupportedBrowser(SupportedBrowser.CHROME)
  @SupportedBrowser(SupportedBrowser.SAFARI)
  @Experimental
  void set closedCaptionsVisible(bool value) native "HTMLMediaElement_webkitClosedCaptionsVisible_Setter";

  @DomName('HTMLMediaElement.webkitHasClosedCaptions')
  @DocsEditable
  @SupportedBrowser(SupportedBrowser.CHROME)
  @SupportedBrowser(SupportedBrowser.SAFARI)
  @Experimental
  bool get hasClosedCaptions native "HTMLMediaElement_webkitHasClosedCaptions_Getter";

  @DomName('HTMLMediaElement.webkitPreservesPitch')
  @DocsEditable
  @SupportedBrowser(SupportedBrowser.CHROME)
  @SupportedBrowser(SupportedBrowser.SAFARI)
  @Experimental
  bool get preservesPitch native "HTMLMediaElement_webkitPreservesPitch_Getter";

  @DomName('HTMLMediaElement.webkitPreservesPitch')
  @DocsEditable
  @SupportedBrowser(SupportedBrowser.CHROME)
  @SupportedBrowser(SupportedBrowser.SAFARI)
  @Experimental
  void set preservesPitch(bool value) native "HTMLMediaElement_webkitPreservesPitch_Setter";

  @DomName('HTMLMediaElement.webkitVideoDecodedByteCount')
  @DocsEditable
  @SupportedBrowser(SupportedBrowser.CHROME)
  @SupportedBrowser(SupportedBrowser.SAFARI)
  @Experimental
  int get videoDecodedByteCount native "HTMLMediaElement_webkitVideoDecodedByteCount_Getter";

  TextTrack addTextTrack(String kind, [String label, String language]) {
    if (?language) {
      return _addTextTrack_1(kind, label, language);
    }
    if (?label) {
      return _addTextTrack_2(kind, label);
    }
    return _addTextTrack_3(kind);
  }

  @DomName('HTMLMediaElement._addTextTrack_1')
  @DocsEditable
  TextTrack _addTextTrack_1(kind, label, language) native "HTMLMediaElement__addTextTrack_1_Callback";

  @DomName('HTMLMediaElement._addTextTrack_2')
  @DocsEditable
  TextTrack _addTextTrack_2(kind, label) native "HTMLMediaElement__addTextTrack_2_Callback";

  @DomName('HTMLMediaElement._addTextTrack_3')
  @DocsEditable
  TextTrack _addTextTrack_3(kind) native "HTMLMediaElement__addTextTrack_3_Callback";

  @DomName('HTMLMediaElement.canPlayType')
  @DocsEditable
  String canPlayType(String type, String keySystem) native "HTMLMediaElement_canPlayType_Callback";

  @DomName('HTMLMediaElement.load')
  @DocsEditable
  void load() native "HTMLMediaElement_load_Callback";

  @DomName('HTMLMediaElement.pause')
  @DocsEditable
  void pause() native "HTMLMediaElement_pause_Callback";

  @DomName('HTMLMediaElement.play')
  @DocsEditable
  void play() native "HTMLMediaElement_play_Callback";

  void addKey(String keySystem, List<int> key, [List<int> initData, String sessionId]) {
    if (?initData) {
      _webkitAddKey_1(keySystem, key, initData, sessionId);
      return;
    }
    _webkitAddKey_2(keySystem, key);
    return;
  }

  @DomName('HTMLMediaElement._webkitAddKey_1')
  @DocsEditable
  void _webkitAddKey_1(keySystem, key, initData, sessionId) native "HTMLMediaElement__webkitAddKey_1_Callback";

  @DomName('HTMLMediaElement._webkitAddKey_2')
  @DocsEditable
  void _webkitAddKey_2(keySystem, key) native "HTMLMediaElement__webkitAddKey_2_Callback";

  @DomName('HTMLMediaElement.webkitCancelKeyRequest')
  @DocsEditable
  @SupportedBrowser(SupportedBrowser.CHROME)
  @SupportedBrowser(SupportedBrowser.SAFARI)
  @Experimental
  void cancelKeyRequest(String keySystem, String sessionId) native "HTMLMediaElement_webkitCancelKeyRequest_Callback";

  void generateKeyRequest(String keySystem, [List<int> initData]) {
    if (?initData) {
      _webkitGenerateKeyRequest_1(keySystem, initData);
      return;
    }
    _webkitGenerateKeyRequest_2(keySystem);
    return;
  }

  @DomName('HTMLMediaElement._webkitGenerateKeyRequest_1')
  @DocsEditable
  void _webkitGenerateKeyRequest_1(keySystem, initData) native "HTMLMediaElement__webkitGenerateKeyRequest_1_Callback";

  @DomName('HTMLMediaElement._webkitGenerateKeyRequest_2')
  @DocsEditable
  void _webkitGenerateKeyRequest_2(keySystem) native "HTMLMediaElement__webkitGenerateKeyRequest_2_Callback";

  @DomName('HTMLMediaElement.oncanplay')
  @DocsEditable
  Stream<Event> get onCanPlay => canPlayEvent.forTarget(this);

  @DomName('HTMLMediaElement.oncanplaythrough')
  @DocsEditable
  Stream<Event> get onCanPlayThrough => canPlayThroughEvent.forTarget(this);

  @DomName('HTMLMediaElement.ondurationchange')
  @DocsEditable
  Stream<Event> get onDurationChange => durationChangeEvent.forTarget(this);

  @DomName('HTMLMediaElement.onemptied')
  @DocsEditable
  Stream<Event> get onEmptied => emptiedEvent.forTarget(this);

  @DomName('HTMLMediaElement.onended')
  @DocsEditable
  Stream<Event> get onEnded => endedEvent.forTarget(this);

  @DomName('HTMLMediaElement.onloadeddata')
  @DocsEditable
  Stream<Event> get onLoadedData => loadedDataEvent.forTarget(this);

  @DomName('HTMLMediaElement.onloadedmetadata')
  @DocsEditable
  Stream<Event> get onLoadedMetadata => loadedMetadataEvent.forTarget(this);

  @DomName('HTMLMediaElement.onloadstart')
  @DocsEditable
  Stream<Event> get onLoadStart => loadStartEvent.forTarget(this);

  @DomName('HTMLMediaElement.onpause')
  @DocsEditable
  Stream<Event> get onPause => pauseEvent.forTarget(this);

  @DomName('HTMLMediaElement.onplay')
  @DocsEditable
  Stream<Event> get onPlay => playEvent.forTarget(this);

  @DomName('HTMLMediaElement.onplaying')
  @DocsEditable
  Stream<Event> get onPlaying => playingEvent.forTarget(this);

  @DomName('HTMLMediaElement.onprogress')
  @DocsEditable
  Stream<Event> get onProgress => progressEvent.forTarget(this);

  @DomName('HTMLMediaElement.onratechange')
  @DocsEditable
  Stream<Event> get onRateChange => rateChangeEvent.forTarget(this);

  @DomName('HTMLMediaElement.onseeked')
  @DocsEditable
  Stream<Event> get onSeeked => seekedEvent.forTarget(this);

  @DomName('HTMLMediaElement.onseeking')
  @DocsEditable
  Stream<Event> get onSeeking => seekingEvent.forTarget(this);

  @DomName('HTMLMediaElement.onshow')
  @DocsEditable
  Stream<Event> get onShow => showEvent.forTarget(this);

  @DomName('HTMLMediaElement.onstalled')
  @DocsEditable
  Stream<Event> get onStalled => stalledEvent.forTarget(this);

  @DomName('HTMLMediaElement.onsuspend')
  @DocsEditable
  Stream<Event> get onSuspend => suspendEvent.forTarget(this);

  @DomName('HTMLMediaElement.ontimeupdate')
  @DocsEditable
  Stream<Event> get onTimeUpdate => timeUpdateEvent.forTarget(this);

  @DomName('HTMLMediaElement.onvolumechange')
  @DocsEditable
  Stream<Event> get onVolumeChange => volumeChangeEvent.forTarget(this);

  @DomName('HTMLMediaElement.onwaiting')
  @DocsEditable
  Stream<Event> get onWaiting => waitingEvent.forTarget(this);

  @DomName('HTMLMediaElement.onwebkitkeyadded')
  @DocsEditable
  Stream<MediaKeyEvent> get onKeyAdded => keyAddedEvent.forTarget(this);

  @DomName('HTMLMediaElement.onwebkitkeyerror')
  @DocsEditable
  Stream<MediaKeyEvent> get onKeyError => keyErrorEvent.forTarget(this);

  @DomName('HTMLMediaElement.onwebkitkeymessage')
  @DocsEditable
  Stream<MediaKeyEvent> get onKeyMessage => keyMessageEvent.forTarget(this);

  @DomName('HTMLMediaElement.onwebkitneedkey')
  @DocsEditable
  Stream<MediaKeyEvent> get onNeedKey => needKeyEvent.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.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('MediaError')
class MediaError extends NativeFieldWrapperClass1 {
  MediaError.internal();

  static const int MEDIA_ERR_ABORTED = 1;

  static const int MEDIA_ERR_DECODE = 3;

  static const int MEDIA_ERR_ENCRYPTED = 5;

  static const int MEDIA_ERR_NETWORK = 2;

  static const int MEDIA_ERR_SRC_NOT_SUPPORTED = 4;

  @DomName('MediaError.code')
  @DocsEditable
  int get code native "MediaError_code_Getter";

}
// 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.


@DocsEditable
@DomName('MediaKeyError')
class MediaKeyError extends NativeFieldWrapperClass1 {
  MediaKeyError.internal();

  static const int MEDIA_KEYERR_CLIENT = 2;

  static const int MEDIA_KEYERR_DOMAIN = 6;

  static const int MEDIA_KEYERR_HARDWARECHANGE = 5;

  static const int MEDIA_KEYERR_OUTPUT = 4;

  static const int MEDIA_KEYERR_SERVICE = 3;

  static const int MEDIA_KEYERR_UNKNOWN = 1;

  @DomName('MediaKeyError.code')
  @DocsEditable
  int get code native "MediaKeyError_code_Getter";

}
// 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.


@DocsEditable
@DomName('MediaKeyEvent')
class MediaKeyEvent extends Event {
  MediaKeyEvent.internal() : super.internal();

  @DomName('MediaKeyEvent.defaultURL')
  @DocsEditable
  String get defaultUrl native "MediaKeyEvent_defaultURL_Getter";

  @DomName('MediaKeyEvent.errorCode')
  @DocsEditable
  MediaKeyError get errorCode native "MediaKeyEvent_errorCode_Getter";

  @DomName('MediaKeyEvent.initData')
  @DocsEditable
  List<int> get initData native "MediaKeyEvent_initData_Getter";

  @DomName('MediaKeyEvent.keySystem')
  @DocsEditable
  String get keySystem native "MediaKeyEvent_keySystem_Getter";

  @DomName('MediaKeyEvent.message')
  @DocsEditable
  List<int> get message native "MediaKeyEvent_message_Getter";

  @DomName('MediaKeyEvent.sessionId')
  @DocsEditable
  String get sessionId native "MediaKeyEvent_sessionId_Getter";

  @DomName('MediaKeyEvent.systemCode')
  @DocsEditable
  int get systemCode native "MediaKeyEvent_systemCode_Getter";

}
// 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.


@DocsEditable
@DomName('MediaList')
class MediaList extends NativeFieldWrapperClass1 {
  MediaList.internal();

  @DomName('MediaList.length')
  @DocsEditable
  int get length native "MediaList_length_Getter";

  @DomName('MediaList.mediaText')
  @DocsEditable
  String get mediaText native "MediaList_mediaText_Getter";

  @DomName('MediaList.mediaText')
  @DocsEditable
  void set mediaText(String value) native "MediaList_mediaText_Setter";

  @DomName('MediaList.appendMedium')
  @DocsEditable
  void appendMedium(String newMedium) native "MediaList_appendMedium_Callback";

  @DomName('MediaList.deleteMedium')
  @DocsEditable
  void deleteMedium(String oldMedium) native "MediaList_deleteMedium_Callback";

  @DomName('MediaList.item')
  @DocsEditable
  String item(int index) native "MediaList_item_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('MediaQueryList')
class MediaQueryList extends NativeFieldWrapperClass1 {
  MediaQueryList.internal();

  @DomName('MediaQueryList.matches')
  @DocsEditable
  bool get matches native "MediaQueryList_matches_Getter";

  @DomName('MediaQueryList.media')
  @DocsEditable
  String get media native "MediaQueryList_media_Getter";

  @DomName('MediaQueryList.addListener')
  @DocsEditable
  void addListener(MediaQueryListListener listener) native "MediaQueryList_addListener_Callback";

  @DomName('MediaQueryList.removeListener')
  @DocsEditable
  void removeListener(MediaQueryListListener listener) native "MediaQueryList_removeListener_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('MediaQueryListListener')
class MediaQueryListListener extends NativeFieldWrapperClass1 {
  MediaQueryListListener.internal();

  @DomName('MediaQueryListListener.queryChanged')
  @DocsEditable
  void queryChanged(MediaQueryList list) native "MediaQueryListListener_queryChanged_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('MediaSource')
class MediaSource extends EventTarget {
  MediaSource.internal() : super.internal();

  @DomName('MediaSource.MediaSource')
  @DocsEditable
  factory MediaSource() {
    return MediaSource._create_1();
  }

  @DocsEditable
  static MediaSource _create_1() native "MediaSource__create_1constructorCallback";

  @DomName('MediaSource.activeSourceBuffers')
  @DocsEditable
  SourceBufferList get activeSourceBuffers native "MediaSource_activeSourceBuffers_Getter";

  @DomName('MediaSource.duration')
  @DocsEditable
  num get duration native "MediaSource_duration_Getter";

  @DomName('MediaSource.duration')
  @DocsEditable
  void set duration(num value) native "MediaSource_duration_Setter";

  @DomName('MediaSource.readyState')
  @DocsEditable
  String get readyState native "MediaSource_readyState_Getter";

  @DomName('MediaSource.sourceBuffers')
  @DocsEditable
  SourceBufferList get sourceBuffers native "MediaSource_sourceBuffers_Getter";

  @DomName('MediaSource.addEventListener')
  @DocsEditable
  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "MediaSource_addEventListener_Callback";

  @DomName('MediaSource.addSourceBuffer')
  @DocsEditable
  SourceBuffer addSourceBuffer(String type) native "MediaSource_addSourceBuffer_Callback";

  @DomName('MediaSource.dispatchEvent')
  @DocsEditable
  bool dispatchEvent(Event event) native "MediaSource_dispatchEvent_Callback";

  @DomName('MediaSource.endOfStream')
  @DocsEditable
  void endOfStream(String error) native "MediaSource_endOfStream_Callback";

  @DomName('MediaSource.removeEventListener')
  @DocsEditable
  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "MediaSource_removeEventListener_Callback";

  @DomName('MediaSource.removeSourceBuffer')
  @DocsEditable
  void removeSourceBuffer(SourceBuffer buffer) native "MediaSource_removeSourceBuffer_Callback";

}
// 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.


@DomName('MediaStream')
@SupportedBrowser(SupportedBrowser.CHROME)
@Experimental
class MediaStream extends EventTarget {
  MediaStream.internal() : super.internal();

  @DomName('MediaStream.addtrackEvent')
  @DocsEditable
  static const EventStreamProvider<Event> addTrackEvent = const EventStreamProvider<Event>('addtrack');

  @DomName('MediaStream.endedEvent')
  @DocsEditable
  static const EventStreamProvider<Event> endedEvent = const EventStreamProvider<Event>('ended');

  @DomName('MediaStream.removetrackEvent')
  @DocsEditable
  static const EventStreamProvider<Event> removeTrackEvent = const EventStreamProvider<Event>('removetrack');

  @DomName('MediaStream.MediaStream')
  @DocsEditable
  factory MediaStream([stream_OR_tracks]) {
    if (!?stream_OR_tracks) {
      return MediaStream._create_1();
    }
    if ((stream_OR_tracks is MediaStream || stream_OR_tracks == null)) {
      return MediaStream._create_2(stream_OR_tracks);
    }
    if ((stream_OR_tracks is List<MediaStreamTrack> || stream_OR_tracks == null)) {
      return MediaStream._create_3(stream_OR_tracks);
    }
    throw new ArgumentError("Incorrect number or type of arguments");
  }

  @DocsEditable
  static MediaStream _create_1() native "MediaStream__create_1constructorCallback";

  @DocsEditable
  static MediaStream _create_2(stream_OR_tracks) native "MediaStream__create_2constructorCallback";

  @DocsEditable
  static MediaStream _create_3(stream_OR_tracks) native "MediaStream__create_3constructorCallback";

  @DomName('MediaStream.ended')
  @DocsEditable
  bool get ended native "MediaStream_ended_Getter";

  @DomName('MediaStream.id')
  @DocsEditable
  String get id native "MediaStream_id_Getter";

  @DomName('MediaStream.label')
  @DocsEditable
  String get label native "MediaStream_label_Getter";

  @DomName('MediaStream.addEventListener')
  @DocsEditable
  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "MediaStream_addEventListener_Callback";

  @DomName('MediaStream.addTrack')
  @DocsEditable
  void addTrack(MediaStreamTrack track) native "MediaStream_addTrack_Callback";

  @DomName('MediaStream.dispatchEvent')
  @DocsEditable
  bool dispatchEvent(Event event) native "MediaStream_dispatchEvent_Callback";

  @DomName('MediaStream.getAudioTracks')
  @DocsEditable
  List<MediaStreamTrack> getAudioTracks() native "MediaStream_getAudioTracks_Callback";

  @DomName('MediaStream.getTrackById')
  @DocsEditable
  MediaStreamTrack getTrackById(String trackId) native "MediaStream_getTrackById_Callback";

  @DomName('MediaStream.getVideoTracks')
  @DocsEditable
  List<MediaStreamTrack> getVideoTracks() native "MediaStream_getVideoTracks_Callback";

  @DomName('MediaStream.removeEventListener')
  @DocsEditable
  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "MediaStream_removeEventListener_Callback";

  @DomName('MediaStream.removeTrack')
  @DocsEditable
  void removeTrack(MediaStreamTrack track) native "MediaStream_removeTrack_Callback";

  @DomName('MediaStream.onaddtrack')
  @DocsEditable
  Stream<Event> get onAddTrack => addTrackEvent.forTarget(this);

  @DomName('MediaStream.onended')
  @DocsEditable
  Stream<Event> get onEnded => endedEvent.forTarget(this);

  @DomName('MediaStream.onremovetrack')
  @DocsEditable
  Stream<Event> get onRemoveTrack => removeTrackEvent.forTarget(this);


  /**
   * Checks if the MediaStream APIs are supported on the current platform.
   *
   * See also:
   *
   * * [Navigator.getUserMedia]
   */
  static bool get supported => 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.


@DocsEditable
@DomName('MediaStreamEvent')
@SupportedBrowser(SupportedBrowser.CHROME)
@Experimental
class MediaStreamEvent extends Event {
  MediaStreamEvent.internal() : super.internal();

  /// Checks if this type is supported on the current platform.
  static bool get supported => true;

  @DomName('MediaStreamEvent.stream')
  @DocsEditable
  MediaStream get stream native "MediaStreamEvent_stream_Getter";

}
// 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.


@DocsEditable
@DomName('MediaStreamTrack')
@SupportedBrowser(SupportedBrowser.CHROME)
@Experimental
class MediaStreamTrack extends EventTarget {
  MediaStreamTrack.internal() : super.internal();

  @DomName('MediaStreamTrack.endedEvent')
  @DocsEditable
  static const EventStreamProvider<Event> endedEvent = const EventStreamProvider<Event>('ended');

  @DomName('MediaStreamTrack.muteEvent')
  @DocsEditable
  static const EventStreamProvider<Event> muteEvent = const EventStreamProvider<Event>('mute');

  @DomName('MediaStreamTrack.unmuteEvent')
  @DocsEditable
  static const EventStreamProvider<Event> unmuteEvent = const EventStreamProvider<Event>('unmute');

  @DomName('MediaStreamTrack.enabled')
  @DocsEditable
  bool get enabled native "MediaStreamTrack_enabled_Getter";

  @DomName('MediaStreamTrack.enabled')
  @DocsEditable
  void set enabled(bool value) native "MediaStreamTrack_enabled_Setter";

  @DomName('MediaStreamTrack.id')
  @DocsEditable
  String get id native "MediaStreamTrack_id_Getter";

  @DomName('MediaStreamTrack.kind')
  @DocsEditable
  String get kind native "MediaStreamTrack_kind_Getter";

  @DomName('MediaStreamTrack.label')
  @DocsEditable
  String get label native "MediaStreamTrack_label_Getter";

  @DomName('MediaStreamTrack.readyState')
  @DocsEditable
  String get readyState native "MediaStreamTrack_readyState_Getter";

  @DomName('MediaStreamTrack.addEventListener')
  @DocsEditable
  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "MediaStreamTrack_addEventListener_Callback";

  @DomName('MediaStreamTrack.dispatchEvent')
  @DocsEditable
  bool dispatchEvent(Event event) native "MediaStreamTrack_dispatchEvent_Callback";

  @DomName('MediaStreamTrack.removeEventListener')
  @DocsEditable
  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "MediaStreamTrack_removeEventListener_Callback";

  @DomName('MediaStreamTrack.onended')
  @DocsEditable
  Stream<Event> get onEnded => endedEvent.forTarget(this);

  @DomName('MediaStreamTrack.onmute')
  @DocsEditable
  Stream<Event> get onMute => muteEvent.forTarget(this);

  @DomName('MediaStreamTrack.onunmute')
  @DocsEditable
  Stream<Event> get onUnmute => unmuteEvent.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.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('MediaStreamTrackEvent')
@SupportedBrowser(SupportedBrowser.CHROME)
@Experimental
class MediaStreamTrackEvent extends Event {
  MediaStreamTrackEvent.internal() : super.internal();

  /// Checks if this type is supported on the current platform.
  static bool get supported => true;

  @DomName('MediaStreamTrackEvent.track')
  @DocsEditable
  MediaStreamTrack get track native "MediaStreamTrackEvent_track_Getter";

}
// 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.


@DocsEditable
@DomName('MemoryInfo')
class MemoryInfo extends NativeFieldWrapperClass1 {
  MemoryInfo.internal();

  @DomName('MemoryInfo.jsHeapSizeLimit')
  @DocsEditable
  int get jsHeapSizeLimit native "MemoryInfo_jsHeapSizeLimit_Getter";

  @DomName('MemoryInfo.totalJSHeapSize')
  @DocsEditable
  int get totalJSHeapSize native "MemoryInfo_totalJSHeapSize_Getter";

  @DomName('MemoryInfo.usedJSHeapSize')
  @DocsEditable
  int get usedJSHeapSize native "MemoryInfo_usedJSHeapSize_Getter";

}
// 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.


@DocsEditable
/**
 * An HTML <menu> element.
 *
 * A <menu> element represents an unordered list of menu commands.
 *
 * See also:
 *
 *  * [Menu Element](https://developer.mozilla.org/en-US/docs/HTML/Element/menu) from MDN.
 *  * [Menu Element](http://www.w3.org/TR/html5/the-menu-element.html#the-menu-element) from the W3C.
 */
@DomName('HTMLMenuElement')
class MenuElement extends _Element_Merged {
  MenuElement.internal() : super.internal();

  @DomName('HTMLMenuElement.HTMLMenuElement')
  @DocsEditable
  factory MenuElement() => document.$dom_createElement("menu");

}
// 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.


@DocsEditable
@DomName('MessageChannel')
class MessageChannel extends NativeFieldWrapperClass1 {
  MessageChannel.internal();

  @DomName('MessageChannel.MessageChannel')
  @DocsEditable
  factory MessageChannel() {
    return MessageChannel._create_1();
  }

  @DocsEditable
  static MessageChannel _create_1() native "MessageChannel__create_1constructorCallback";

  @DomName('MessageChannel.port1')
  @DocsEditable
  MessagePort get port1 native "MessageChannel_port1_Getter";

  @DomName('MessageChannel.port2')
  @DocsEditable
  MessagePort get port2 native "MessageChannel_port2_Getter";

}
// 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.


@DomName('MessageEvent')
class MessageEvent extends Event {
  factory MessageEvent(String type,
      {bool canBubble: false, bool cancelable: false, Object data,
      String origin, String lastEventId,
      Window source, List messagePorts}) {
    if (source == null) {
      source = window;
    }
    var event = document.$dom_createEvent("MessageEvent");
    event.$dom_initMessageEvent(type, canBubble, cancelable, data, origin,
        lastEventId, source, messagePorts);
    return event;
  }
  MessageEvent.internal() : super.internal();

  @DomName('MessageEvent.data')
  @DocsEditable
  Object get data native "MessageEvent_data_Getter";

  @DomName('MessageEvent.lastEventId')
  @DocsEditable
  String get lastEventId native "MessageEvent_lastEventId_Getter";

  @DomName('MessageEvent.origin')
  @DocsEditable
  String get origin native "MessageEvent_origin_Getter";

  @DomName('MessageEvent.ports')
  @DocsEditable
  List get ports native "MessageEvent_ports_Getter";

  @DomName('MessageEvent.source')
  @DocsEditable
  WindowBase get source native "MessageEvent_source_Getter";

  @DomName('MessageEvent.initMessageEvent')
  @DocsEditable
  void $dom_initMessageEvent(String typeArg, bool canBubbleArg, bool cancelableArg, Object dataArg, String originArg, String lastEventIdArg, Window sourceArg, List messagePorts) native "MessageEvent_initMessageEvent_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('MessagePort')
class MessagePort extends EventTarget {
  MessagePort.internal() : super.internal();

  @DomName('MessagePort.messageEvent')
  @DocsEditable
  static const EventStreamProvider<MessageEvent> messageEvent = const EventStreamProvider<MessageEvent>('message');

  @DomName('MessagePort.addEventListener')
  @DocsEditable
  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "MessagePort_addEventListener_Callback";

  @DomName('MessagePort.close')
  @DocsEditable
  void close() native "MessagePort_close_Callback";

  @DomName('MessagePort.dispatchEvent')
  @DocsEditable
  bool dispatchEvent(Event evt) native "MessagePort_dispatchEvent_Callback";

  @DomName('MessagePort.postMessage')
  @DocsEditable
  void postMessage(Object message, [List messagePorts]) native "MessagePort_postMessage_Callback";

  @DomName('MessagePort.removeEventListener')
  @DocsEditable
  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "MessagePort_removeEventListener_Callback";

  @DomName('MessagePort.start')
  @DocsEditable
  void start() native "MessagePort_start_Callback";

  @DomName('MessagePort.onmessage')
  @DocsEditable
  Stream<MessageEvent> get onMessage => messageEvent.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.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('HTMLMetaElement')
class MetaElement extends _Element_Merged {
  MetaElement.internal() : super.internal();

  @DomName('HTMLMetaElement.content')
  @DocsEditable
  String get content native "HTMLMetaElement_content_Getter";

  @DomName('HTMLMetaElement.content')
  @DocsEditable
  void set content(String value) native "HTMLMetaElement_content_Setter";

  @DomName('HTMLMetaElement.httpEquiv')
  @DocsEditable
  String get httpEquiv native "HTMLMetaElement_httpEquiv_Getter";

  @DomName('HTMLMetaElement.httpEquiv')
  @DocsEditable
  void set httpEquiv(String value) native "HTMLMetaElement_httpEquiv_Setter";

  @DomName('HTMLMetaElement.name')
  @DocsEditable
  String get name native "HTMLMetaElement_name_Getter";

  @DomName('HTMLMetaElement.name')
  @DocsEditable
  void set name(String value) native "HTMLMetaElement_name_Setter";

}
// 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.


@DocsEditable
@DomName('Metadata')
class Metadata extends NativeFieldWrapperClass1 {
  Metadata.internal();

  @DomName('Metadata.modificationTime')
  @DocsEditable
  DateTime get modificationTime native "Metadata_modificationTime_Getter";

  @DomName('Metadata.size')
  @DocsEditable
  int get size native "Metadata_size_Getter";

}
// 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.


typedef void MetadataCallback(Metadata metadata);
// 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.


@DocsEditable
@DomName('HTMLMeterElement')
@SupportedBrowser(SupportedBrowser.CHROME)
@SupportedBrowser(SupportedBrowser.FIREFOX)
@SupportedBrowser(SupportedBrowser.SAFARI)
class MeterElement extends _Element_Merged {
  MeterElement.internal() : super.internal();

  @DomName('HTMLMeterElement.HTMLMeterElement')
  @DocsEditable
  factory MeterElement() => document.$dom_createElement("meter");

  /// Checks if this type is supported on the current platform.
  static bool get supported => true;

  @DomName('HTMLMeterElement.high')
  @DocsEditable
  num get high native "HTMLMeterElement_high_Getter";

  @DomName('HTMLMeterElement.high')
  @DocsEditable
  void set high(num value) native "HTMLMeterElement_high_Setter";

  @DomName('HTMLMeterElement.labels')
  @DocsEditable
  List<Node> get labels native "HTMLMeterElement_labels_Getter";

  @DomName('HTMLMeterElement.low')
  @DocsEditable
  num get low native "HTMLMeterElement_low_Getter";

  @DomName('HTMLMeterElement.low')
  @DocsEditable
  void set low(num value) native "HTMLMeterElement_low_Setter";

  @DomName('HTMLMeterElement.max')
  @DocsEditable
  num get max native "HTMLMeterElement_max_Getter";

  @DomName('HTMLMeterElement.max')
  @DocsEditable
  void set max(num value) native "HTMLMeterElement_max_Setter";

  @DomName('HTMLMeterElement.min')
  @DocsEditable
  num get min native "HTMLMeterElement_min_Getter";

  @DomName('HTMLMeterElement.min')
  @DocsEditable
  void set min(num value) native "HTMLMeterElement_min_Setter";

  @DomName('HTMLMeterElement.optimum')
  @DocsEditable
  num get optimum native "HTMLMeterElement_optimum_Getter";

  @DomName('HTMLMeterElement.optimum')
  @DocsEditable
  void set optimum(num value) native "HTMLMeterElement_optimum_Setter";

  @DomName('HTMLMeterElement.value')
  @DocsEditable
  num get value native "HTMLMeterElement_value_Getter";

  @DomName('HTMLMeterElement.value')
  @DocsEditable
  void set value(num value) native "HTMLMeterElement_value_Setter";

}
// 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.


@DocsEditable
@DomName('HTMLModElement')
class ModElement extends _Element_Merged {
  ModElement.internal() : super.internal();

  @DomName('HTMLModElement.cite')
  @DocsEditable
  String get cite native "HTMLModElement_cite_Getter";

  @DomName('HTMLModElement.cite')
  @DocsEditable
  void set cite(String value) native "HTMLModElement_cite_Setter";

  @DomName('HTMLModElement.dateTime')
  @DocsEditable
  String get dateTime native "HTMLModElement_dateTime_Getter";

  @DomName('HTMLModElement.dateTime')
  @DocsEditable
  void set dateTime(String value) native "HTMLModElement_dateTime_Setter";

}
// 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('MouseEvent')
class MouseEvent extends UIEvent {
  factory MouseEvent(String type,
      {Window view, int detail: 0, int screenX: 0, int screenY: 0,
      int clientX: 0, int clientY: 0, int button: 0, bool canBubble: true,
      bool cancelable: true, bool ctrlKey: false, bool altKey: false,
      bool shiftKey: false, bool metaKey: false, EventTarget relatedTarget}) {

    if (view == null) {
      view = window;
    }
    var event = document.$dom_createEvent('MouseEvent');
    event.$dom_initMouseEvent(type, canBubble, cancelable, view, detail,
        screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey,
        button, relatedTarget);
    return event;
  }
  MouseEvent.internal() : super.internal();

  @DomName('MouseEvent.altKey')
  @DocsEditable
  bool get altKey native "MouseEvent_altKey_Getter";

  @DomName('MouseEvent.button')
  @DocsEditable
  int get button native "MouseEvent_button_Getter";

  @DomName('MouseEvent.clientX')
  @DocsEditable
  int get $dom_clientX native "MouseEvent_clientX_Getter";

  @DomName('MouseEvent.clientY')
  @DocsEditable
  int get $dom_clientY native "MouseEvent_clientY_Getter";

  @DomName('MouseEvent.ctrlKey')
  @DocsEditable
  bool get ctrlKey native "MouseEvent_ctrlKey_Getter";

  @DomName('MouseEvent.dataTransfer')
  @DocsEditable
  DataTransfer get dataTransfer native "MouseEvent_dataTransfer_Getter";

  @DomName('MouseEvent.fromElement')
  @DocsEditable
  Node get fromElement native "MouseEvent_fromElement_Getter";

  @DomName('MouseEvent.metaKey')
  @DocsEditable
  bool get metaKey native "MouseEvent_metaKey_Getter";

  @DomName('MouseEvent.offsetX')
  @DocsEditable
  int get $dom_offsetX native "MouseEvent_offsetX_Getter";

  @DomName('MouseEvent.offsetY')
  @DocsEditable
  int get $dom_offsetY native "MouseEvent_offsetY_Getter";

  @DomName('MouseEvent.relatedTarget')
  @DocsEditable
  EventTarget get relatedTarget native "MouseEvent_relatedTarget_Getter";

  @DomName('MouseEvent.screenX')
  @DocsEditable
  int get $dom_screenX native "MouseEvent_screenX_Getter";

  @DomName('MouseEvent.screenY')
  @DocsEditable
  int get $dom_screenY native "MouseEvent_screenY_Getter";

  @DomName('MouseEvent.shiftKey')
  @DocsEditable
  bool get shiftKey native "MouseEvent_shiftKey_Getter";

  @DomName('MouseEvent.toElement')
  @DocsEditable
  Node get toElement native "MouseEvent_toElement_Getter";

  @DomName('MouseEvent.webkitMovementX')
  @DocsEditable
  @SupportedBrowser(SupportedBrowser.CHROME)
  @SupportedBrowser(SupportedBrowser.SAFARI)
  @Experimental
  int get $dom_webkitMovementX native "MouseEvent_webkitMovementX_Getter";

  @DomName('MouseEvent.webkitMovementY')
  @DocsEditable
  @SupportedBrowser(SupportedBrowser.CHROME)
  @SupportedBrowser(SupportedBrowser.SAFARI)
  @Experimental
  int get $dom_webkitMovementY native "MouseEvent_webkitMovementY_Getter";

  @DomName('MouseEvent.initMouseEvent')
  @DocsEditable
  void $dom_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) native "MouseEvent_initMouseEvent_Callback";


  @deprecated
  int get clientX => client.x;
  @deprecated
  int get clientY => client.y;
  @deprecated
  int get offsetX => offset.x;
  @deprecated
  int get offsetY => offset.y;
  @deprecated
  int get movementX => movement.x;
  @deprecated
  int get movementY => movement.y;
  @deprecated
  int get screenX => screen.x;
  @deprecated
  int get screenY => screen.y;

  @DomName('MouseEvent.clientX')
  @DomName('MouseEvent.clientY')
  Point get client => new Point($dom_clientX, $dom_clientY);

  @DomName('MouseEvent.movementX')
  @DomName('MouseEvent.movementY')
  @SupportedBrowser(SupportedBrowser.CHROME)
  @SupportedBrowser(SupportedBrowser.SAFARI)
  @Experimental
  Point get movement => new Point($dom_webkitMovementX, $dom_webkitMovementY);

  /**
   * The coordinates of the mouse pointer in target node coordinates.
   *
   * This value may vary between platforms if the target node moves
   * after the event has fired or if the element has CSS transforms affecting
   * it.
   */
  Point get offset => new Point($dom_offsetX, $dom_offsetY);

  @DomName('MouseEvent.screenX')
  @DomName('MouseEvent.screenY')
  Point get screen => new Point($dom_screenX, $dom_screenY);
}
// 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.


typedef void MutationCallback(List<MutationRecord> mutations, MutationObserver observer);
// 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('MutationEvent')
class MutationEvent extends Event {
  factory MutationEvent(String type,
      {bool canBubble: false, bool cancelable: false, Node relatedNode,
      String prevValue, String newValue, String attrName, int attrChange: 0}) {

    var event = document.$dom_createEvent('MutationEvent');
    event.$dom_initMutationEvent(type, canBubble, cancelable, relatedNode,
        prevValue, newValue, attrName, attrChange);
    return event;
  }
  MutationEvent.internal() : super.internal();

  static const int ADDITION = 2;

  static const int MODIFICATION = 1;

  static const int REMOVAL = 3;

  @DomName('MutationEvent.attrChange')
  @DocsEditable
  int get attrChange native "MutationEvent_attrChange_Getter";

  @DomName('MutationEvent.attrName')
  @DocsEditable
  String get attrName native "MutationEvent_attrName_Getter";

  @DomName('MutationEvent.newValue')
  @DocsEditable
  String get newValue native "MutationEvent_newValue_Getter";

  @DomName('MutationEvent.prevValue')
  @DocsEditable
  String get prevValue native "MutationEvent_prevValue_Getter";

  @DomName('MutationEvent.relatedNode')
  @DocsEditable
  Node get relatedNode native "MutationEvent_relatedNode_Getter";

  @DomName('MutationEvent.initMutationEvent')
  @DocsEditable
  void $dom_initMutationEvent(String type, bool canBubble, bool cancelable, Node relatedNode, String prevValue, String newValue, String attrName, int attrChange) native "MutationEvent_initMutationEvent_Callback";

}



// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.


@DomName('MutationObserver')
@SupportedBrowser(SupportedBrowser.CHROME)
@SupportedBrowser(SupportedBrowser.FIREFOX)
@SupportedBrowser(SupportedBrowser.SAFARI)
@Experimental
class MutationObserver extends NativeFieldWrapperClass1 {
  MutationObserver.internal();
  factory MutationObserver(MutationCallback callback) => _create(callback);

  @DocsEditable
  static MutationObserver _create(callback) native "MutationObserver_constructorCallback";

  @DomName('MutationObserver.disconnect')
  @DocsEditable
  void disconnect() native "MutationObserver_disconnect_Callback";

  @DomName('MutationObserver._observe')
  @DocsEditable
  void _observe(Node target, Map options) native "MutationObserver__observe_Callback";

  @DomName('MutationObserver.takeRecords')
  @DocsEditable
  List<MutationRecord> takeRecords() native "MutationObserver_takeRecords_Callback";

  /**
   * Checks to see if the mutation observer API is supported on the current
   * platform.
   */
  static bool get supported {
    return true;
  }

  void observe(Node target,
               {Map options,
                bool childList,
                bool attributes,
                bool characterData,
                bool subtree,
                bool attributeOldValue,
                bool characterDataOldValue,
                List<String> attributeFilter}) {

    // Parse options into map of known type.
    var parsedOptions = _createDict();

    if (options != null) {
      options.forEach((k, v) {
          if (_boolKeys.containsKey(k)) {
            _add(parsedOptions, k, true == v);
          } else if (k == 'attributeFilter') {
            _add(parsedOptions, k, _fixupList(v));
          } else {
            throw new ArgumentError(
                "Illegal MutationObserver.observe option '$k'");
          }
        });
    }

    // Override options passed in the map with named optional arguments.
    override(key, value) {
      if (value != null) _add(parsedOptions, key, value);
    }

    override('childList', childList);
    override('attributes', attributes);
    override('characterData', characterData);
    override('subtree', subtree);
    override('attributeOldValue', attributeOldValue);
    override('characterDataOldValue', characterDataOldValue);
    if (attributeFilter != null) {
      override('attributeFilter', _fixupList(attributeFilter));
    }

    _call(target, parsedOptions);
  }

   // TODO: Change to a set when const Sets are available.
  static final _boolKeys =
    const {'childList': true,
           'attributes': true,
           'characterData': true,
           'subtree': true,
           'attributeOldValue': true,
           'characterDataOldValue': true };

  static _createDict() => {};
  static _add(m, String key, value) { m[key] = value; }
  static _fixupList(list) => list;

  void _call(Node target, options) {
    _observe(target, options);
  }

}
// 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.


@DocsEditable
@DomName('MutationRecord')
class MutationRecord extends NativeFieldWrapperClass1 {
  MutationRecord.internal();

  @DomName('MutationRecord.addedNodes')
  @DocsEditable
  List<Node> get addedNodes native "MutationRecord_addedNodes_Getter";

  @DomName('MutationRecord.attributeName')
  @DocsEditable
  String get attributeName native "MutationRecord_attributeName_Getter";

  @DomName('MutationRecord.attributeNamespace')
  @DocsEditable
  String get attributeNamespace native "MutationRecord_attributeNamespace_Getter";

  @DomName('MutationRecord.nextSibling')
  @DocsEditable
  Node get nextSibling native "MutationRecord_nextSibling_Getter";

  @DomName('MutationRecord.oldValue')
  @DocsEditable
  String get oldValue native "MutationRecord_oldValue_Getter";

  @DomName('MutationRecord.previousSibling')
  @DocsEditable
  Node get previousSibling native "MutationRecord_previousSibling_Getter";

  @DomName('MutationRecord.removedNodes')
  @DocsEditable
  List<Node> get removedNodes native "MutationRecord_removedNodes_Getter";

  @DomName('MutationRecord.target')
  @DocsEditable
  Node get target native "MutationRecord_target_Getter";

  @DomName('MutationRecord.type')
  @DocsEditable
  String get type native "MutationRecord_type_Getter";

}
// 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')
class Navigator extends NativeFieldWrapperClass1 {


  /**
   * Gets a stream (video and or audio) from the local computer.
   *
   * Use [MediaStream.supported] to check if this is supported by the current
   * platform.
   *
   * Example use:
   *
   *     window.navigator.getUserMedia(audio:true, video: true).then((stream) {
   *       var video = new VideoElement()
   *         ..autoplay = true
   *         ..src = Url.createObjectUrl(stream);
   *       document.body.append(video);
   *     });
   *
   * See also:
   * * [MediaStream.supported]
   */
  @DomName('Navigator.webkitGetUserMedia')
  @SupportedBrowser(SupportedBrowser.CHROME)
  @Experimental
  Future<LocalMediaStream> getUserMedia({bool audio: false,
      bool video: false}) {
    var completer = new Completer<LocalMediaStream>();
    var options = {
      'audio': audio,
      'video': video
    };
    this._getUserMedia(options,
      (stream) {
        completer.complete(stream);
      },
      (error) {
        completer.completeError(error);
      });
    return completer.future;
  }


  Navigator.internal();

  @DomName('Navigator.appCodeName')
  @DocsEditable
  String get appCodeName native "Navigator_appCodeName_Getter";

  @DomName('Navigator.appName')
  @DocsEditable
  String get appName native "Navigator_appName_Getter";

  @DomName('Navigator.appVersion')
  @DocsEditable
  String get appVersion native "Navigator_appVersion_Getter";

  @DomName('Navigator.cookieEnabled')
  @DocsEditable
  bool get cookieEnabled native "Navigator_cookieEnabled_Getter";

  @DomName('Navigator.geolocation')
  @DocsEditable
  Geolocation get geolocation native "Navigator_geolocation_Getter";

  @DomName('Navigator.language')
  @DocsEditable
  String get language native "Navigator_language_Getter";

  @DomName('Navigator.mimeTypes')
  @DocsEditable
  DomMimeTypeArray get mimeTypes native "Navigator_mimeTypes_Getter";

  @DomName('Navigator.onLine')
  @DocsEditable
  bool get onLine native "Navigator_onLine_Getter";

  @DomName('Navigator.platform')
  @DocsEditable
  String get platform native "Navigator_platform_Getter";

  @DomName('Navigator.plugins')
  @DocsEditable
  DomPluginArray get plugins native "Navigator_plugins_Getter";

  @DomName('Navigator.product')
  @DocsEditable
  String get product native "Navigator_product_Getter";

  @DomName('Navigator.productSub')
  @DocsEditable
  String get productSub native "Navigator_productSub_Getter";

  @DomName('Navigator.userAgent')
  @DocsEditable
  String get userAgent native "Navigator_userAgent_Getter";

  @DomName('Navigator.vendor')
  @DocsEditable
  String get vendor native "Navigator_vendor_Getter";

  @DomName('Navigator.vendorSub')
  @DocsEditable
  String get vendorSub native "Navigator_vendorSub_Getter";

  @DomName('Navigator.webkitBattery')
  @DocsEditable
  @SupportedBrowser(SupportedBrowser.CHROME)
  @SupportedBrowser(SupportedBrowser.SAFARI)
  @Experimental
  BatteryManager get battery native "Navigator_webkitBattery_Getter";

  @DomName('Navigator.getStorageUpdates')
  @DocsEditable
  void getStorageUpdates() native "Navigator_getStorageUpdates_Callback";

  @DomName('Navigator.javaEnabled')
  @DocsEditable
  bool javaEnabled() native "Navigator_javaEnabled_Callback";

  @DomName('Navigator.webkitGetGamepads')
  @DocsEditable
  @SupportedBrowser(SupportedBrowser.CHROME)
  @SupportedBrowser(SupportedBrowser.SAFARI)
  @Experimental
  List<Gamepad> getGamepads() native "Navigator_webkitGetGamepads_Callback";

  @DomName('Navigator.webkitGetUserMedia')
  @DocsEditable
  void _getUserMedia(Map options, _NavigatorUserMediaSuccessCallback successCallback, [_NavigatorUserMediaErrorCallback errorCallback]) native "Navigator_webkitGetUserMedia_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('NavigatorUserMediaError')
class NavigatorUserMediaError extends NativeFieldWrapperClass1 {
  NavigatorUserMediaError.internal();

  static const int PERMISSION_DENIED = 1;

  @DomName('NavigatorUserMediaError.code')
  @DocsEditable
  int get code native "NavigatorUserMediaError_code_Getter";

}
// 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.


typedef void _NavigatorUserMediaErrorCallback(NavigatorUserMediaError error);
// 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.


typedef void _NavigatorUserMediaSuccessCallback(LocalMediaStream stream);
// 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 implements List {
  final Node _this;

  _ChildNodeListLazy(this._this);


  Node get first {
    Node result = _this.$dom_firstChild;
    if (result == null) throw new StateError("No elements");
    return result;
  }
  Node get last {
    Node result = _this.$dom_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.$dom_firstChild;
  }

  Node min([int compare(Node a, Node b)]) {
    return IterableMixinWorkaround.min(this, compare);
  }

  Node max([int compare(Node a, Node b)]) {
    return IterableMixinWorkaround.max(this, compare);
  }

  void add(Node value) {
    _this.append(value);
  }

  void addLast(Node value) {
    _this.append(value);
  }


  void addAll(Iterable<Node> iterable) {
    if (iterable is _ChildNodeListLazy) {
      if (!identical(iterable._this, _this)) {
        // Optimized route for copying between nodes.
        for (var i = 0, len = iterable.length; i < len; ++i) {
          // Should use $dom_firstChild, Bug 8886.
          _this.append(iterable[0]);
        }
      }
      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]);
    }
  }

  Node removeLast() {
    final result = last;
    if (result != null) {
      _this.$dom_removeChild(result);
    }
    return result;
  }

  Node removeAt(int index) {
    var result = this[index];
    if (result != null) {
      _this.$dom_removeChild(result);
    }
    return result;
  }

  void remove(Object object) {
    if (object is! Node) return;
    Node node = object;
    if (!identical(_this, node.parentNode)) return;
    _this.$dom_removeChild(node);
  }

  void removeAll(Iterable elements) {
    IterableMixinWorkaround.removeAll(this, elements);
  }

  void retainAll(Iterable elements) {
    IterableMixinWorkaround.retainAll(this, elements);
  }

  void removeWhere(bool test(Node node)) {
    IterableMixinWorkaround.removeWhere(this, test);
  }

  void retainWhere(bool test(Node node)) {
    IterableMixinWorkaround.retainWhere(this, test);
  }

  void clear() {
    _this.text = '';
  }

  void operator []=(int index, Node value) {
    _this.$dom_replaceChild(value, this[index]);
  }

  Iterator<Node> get iterator => _this.$dom_childNodes.iterator;

  // TODO(jacobr): We can implement these methods much more efficiently by
  // looking up the nodeList only once instead of once per iteration.
  bool contains(Node element) => IterableMixinWorkaround.contains(this, element);

  void forEach(void f(Node element)) => IterableMixinWorkaround.forEach(this, f);

  dynamic reduce(dynamic initialValue,
      dynamic combine(dynamic previousValue, Node element)) {
    return IterableMixinWorkaround.reduce(this, initialValue, combine);
  }

  String join([String separator]) {
    return IterableMixinWorkaround.joinList(this, separator);
  }

  Iterable map(f(Node element)) {
    return IterableMixinWorkaround.mapList(this, f);
  }

  Iterable<Node> where(bool f(Node element)) {
    return IterableMixinWorkaround.where(this, f);
  }

  Iterable expand(Iterable f(Node element)) {
    return IterableMixinWorkaround.expand(this, f);
  }

  bool every(bool f(Node element)) => IterableMixinWorkaround.every(this, f);

  bool any(bool f(Node element)) => IterableMixinWorkaround.any(this, f);

  List<Node> toList({ bool growable: true }) =>
      new List<Node>.from(this, growable: growable);
  Set<Node> toSet() => new Set<Node>.from(this);

  bool get isEmpty => this.length == 0;

  // From List<Node>:

  Iterable<Node> take(int n) {
    return IterableMixinWorkaround.takeList(this, n);
  }

  Iterable<Node> takeWhile(bool test(Node value)) {
    return IterableMixinWorkaround.takeWhile(this, test);
  }

  Iterable<Node> skip(int n) {
    return IterableMixinWorkaround.skipList(this, n);
  }

  Iterable<Node> skipWhile(bool test(Node value)) {
    return IterableMixinWorkaround.skipWhile(this, test);
  }

  Node firstWhere(bool test(Node value), {Node orElse()}) {
    return IterableMixinWorkaround.firstWhere(this, test, orElse);
  }

  Node lastWhere(bool test(Node value), {Node orElse()}) {
    return IterableMixinWorkaround.lastWhereList(this, test, orElse);
  }

  Node singleWhere(bool test(Node value)) {
    return IterableMixinWorkaround.singleWhere(this, test);
  }

  Node elementAt(int index) {
    return this[index];
  }

  Iterable<Node> get reversed {
    return IterableMixinWorkaround.reversedList(this);
  }

  // TODO(jacobr): this could be implemented for child node lists.
  // The exception we throw here is misleading.
  void sort([int compare(Node a, Node b)]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(Node element, [int start = 0]) =>
      Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(Node element, [int start = 0]) =>
      Lists.lastIndexOf(this, element, start);

  // FIXME: implement these.
  void setRange(int start, int rangeLength, List<Node> from, [int startFrom]) {
    throw new UnsupportedError(
        "Cannot setRange on immutable List.");
  }
  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError(
        "Cannot removeRange on immutable List.");
  }
  void insertRange(int start, int rangeLength, [Node initialValue]) {
    throw new UnsupportedError(
        "Cannot insertRange on immutable List.");
  }
  List<Node> sublist(int start, [int end]) {
    if (end == null) end == length;
    return Lists.getRange(this, start, end, <Node>[]);
  }

  List<Node> getRange(int start, int rangeLength) =>
      sublist(start, start + rangeLength);

  // -- end List<Node> mixins.

  // TODO(jacobr): benchmark whether this is more efficient or whether caching
  // a local copy of $dom_childNodes is more efficient.
  int get length => _this.$dom_childNodes.length;

  void set length(int value) {
    throw new UnsupportedError(
        "Cannot set length on immutable List.");
  }

  Node operator[](int index) => _this.$dom_childNodes[index];

  Map<int, Node> asMap() => IterableMixinWorkaround.asMapList(this);
}

@DomName('Node')
class Node extends EventTarget {
  List<Node> get nodes {
    return new _ChildNodeListLazy(this);
  }

  void set nodes(Collection<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.$dom_removeChild(this);
    }
  }

  /**
   * Replaces this node with another node.
   */
  @DomName('Node.replaceChild')
  Node replaceWith(Node otherNode) {
    try {
      final Node parent = this.parentNode;
      parent.$dom_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) {
      if (identical(newNodes._this, this)) {
        throw new ArgumentError(newNodes);
      }

      // Optimized route for copying between nodes.
      for (var i = 0, len = newNodes.length; i < len; ++i) {
        // Should use $dom_firstChild, Bug 8886.
        this.insertBefore(newNodes[0], refChild);
      }
    } else {
      for (var node in newNodes) {
        this.insertBefore(node, refChild);
      }
    }
  }

  // Note that this may either be the locally set model or a cached value
  // of the inherited model. This is cached to minimize model change
  // notifications.
  var _model;
  bool _hasLocalModel;
  StreamController<Node> _modelChangedStream;

  /**
   * The data model which is inherited through the tree.
   *
   * Setting this will propagate the value to all descendant nodes. If the
   * model is not set on this node then it will be inherited from ancestor
   * nodes.
   *
   * Currently this does not support propagation through Shadow DOMs.
   *
   * [clearModel] must be used to remove the model property from this node
   * and have the model inherit from ancestor nodes.
   */
  @Experimental
  get model {
    // If we have a change handler then we've cached the model locally.
    if (_modelChangedStream != null) {
      return _model;
    }
    // Otherwise start looking up the tree.
    for (var node = this; node != null; node = node.parentNode) {
      if (node._hasLocalModel == true) {
        return node._model;
      }
    }
    return null;
  }

  @Experimental
  void set model(value) {
    var changed = model != value;
    _model = value;
    _hasLocalModel = true;
    _ModelTreeObserver.initialize();

    if (changed) {
      if (_modelChangedStream != null) {
        _modelChangedStream.add(this);
      }
      // Propagate new model to all descendants.
      _ModelTreeObserver.propagateModel(this, value, false);
    }
  }

  /**
   * Clears the locally set model and makes this model be inherited from parent
   * nodes.
   */
  @Experimental
  void clearModel() {
    if (_hasLocalModel == true) {
      _hasLocalModel = false;

      // Propagate new model to all descendants.
      if (parentNode != null) {
        _ModelTreeObserver.propagateModel(this, parentNode.model, false);
      } else {
        _ModelTreeObserver.propagateModel(this, null, false);
      }
    }
  }

  /**
   * Get a stream of models, whenever the model changes.
   */
  Stream<Node> get onModelChanged {
    if (_modelChangedStream == null) {
      // Ensure the model is cached locally to minimize change notifications.
      _model = model;
      _modelChangedStream = new StreamController.broadcast();
    }
    return _modelChangedStream.stream;
  }

  Node.internal() : super.internal();

  @DomName('Node.childNodes')
  @DocsEditable
  List<Node> get $dom_childNodes native "Node_childNodes_Getter";

  @DomName('Node.firstChild')
  @DocsEditable
  Node get $dom_firstChild native "Node_firstChild_Getter";

  @DomName('Node.lastChild')
  @DocsEditable
  Node get $dom_lastChild native "Node_lastChild_Getter";

  @DomName('Node.localName')
  @DocsEditable
  String get $dom_localName native "Node_localName_Getter";

  @DomName('Node.namespaceURI')
  @DocsEditable
  String get $dom_namespaceUri native "Node_namespaceURI_Getter";

  @DomName('Node.nextSibling')
  @DocsEditable
  Node get nextNode native "Node_nextSibling_Getter";

  @DomName('Node.nodeType')
  @DocsEditable
  int get nodeType native "Node_nodeType_Getter";

  @DomName('Node.nodeValue')
  @DocsEditable
  String get nodeValue native "Node_nodeValue_Getter";

  @DomName('Node.ownerDocument')
  @DocsEditable
  Document get document native "Node_ownerDocument_Getter";

  @DomName('Node.parentElement')
  @DocsEditable
  Element get parent native "Node_parentElement_Getter";

  @DomName('Node.parentNode')
  @DocsEditable
  Node get parentNode native "Node_parentNode_Getter";

  @DomName('Node.previousSibling')
  @DocsEditable
  Node get previousNode native "Node_previousSibling_Getter";

  @DomName('Node.textContent')
  @DocsEditable
  String get text native "Node_textContent_Getter";

  @DomName('Node.textContent')
  @DocsEditable
  void set text(String value) native "Node_textContent_Setter";

  @DomName('Node.addEventListener')
  @DocsEditable
  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "Node_addEventListener_Callback";

  @DomName('Node.appendChild')
  @DocsEditable
  Node append(Node newChild) native "Node_appendChild_Callback";

  @DomName('Node.cloneNode')
  @DocsEditable
  Node clone(bool deep) native "Node_cloneNode_Callback";

  @DomName('Node.contains')
  @DocsEditable
  bool contains(Node other) native "Node_contains_Callback";

  @DomName('Node.dispatchEvent')
  @DocsEditable
  bool dispatchEvent(Event event) native "Node_dispatchEvent_Callback";

  @DomName('Node.hasChildNodes')
  @DocsEditable
  bool hasChildNodes() native "Node_hasChildNodes_Callback";

  @DomName('Node.insertBefore')
  @DocsEditable
  Node insertBefore(Node newChild, Node refChild) native "Node_insertBefore_Callback";

  @DomName('Node.removeChild')
  @DocsEditable
  Node $dom_removeChild(Node oldChild) native "Node_removeChild_Callback";

  @DomName('Node.removeEventListener')
  @DocsEditable
  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "Node_removeEventListener_Callback";

  @DomName('Node.replaceChild')
  @DocsEditable
  Node $dom_replaceChild(Node newChild, Node oldChild) native "Node_replaceChild_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('NodeFilter')
class NodeFilter extends NativeFieldWrapperClass1 {
  NodeFilter.internal();

  static const int FILTER_ACCEPT = 1;

  static const int FILTER_REJECT = 2;

  static const int FILTER_SKIP = 3;

  static const int SHOW_ALL = 0xFFFFFFFF;

  static const int SHOW_ATTRIBUTE = 0x00000002;

  static const int SHOW_CDATA_SECTION = 0x00000008;

  static const int SHOW_COMMENT = 0x00000080;

  static const int SHOW_DOCUMENT = 0x00000100;

  static const int SHOW_DOCUMENT_FRAGMENT = 0x00000400;

  static const int SHOW_DOCUMENT_TYPE = 0x00000200;

  static const int SHOW_ELEMENT = 0x00000001;

  static const int SHOW_ENTITY = 0x00000020;

  static const int SHOW_ENTITY_REFERENCE = 0x00000010;

  static const int SHOW_NOTATION = 0x00000800;

  static const int SHOW_PROCESSING_INSTRUCTION = 0x00000040;

  static const int SHOW_TEXT = 0x00000004;

  @DomName('NodeFilter.acceptNode')
  @DocsEditable
  int acceptNode(Node n) native "NodeFilter_acceptNode_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('NodeIterator')
class NodeIterator extends NativeFieldWrapperClass1 {
  NodeIterator.internal();

  @DomName('NodeIterator.expandEntityReferences')
  @DocsEditable
  bool get expandEntityReferences native "NodeIterator_expandEntityReferences_Getter";

  @DomName('NodeIterator.filter')
  @DocsEditable
  NodeFilter get filter native "NodeIterator_filter_Getter";

  @DomName('NodeIterator.pointerBeforeReferenceNode')
  @DocsEditable
  bool get pointerBeforeReferenceNode native "NodeIterator_pointerBeforeReferenceNode_Getter";

  @DomName('NodeIterator.referenceNode')
  @DocsEditable
  Node get referenceNode native "NodeIterator_referenceNode_Getter";

  @DomName('NodeIterator.root')
  @DocsEditable
  Node get root native "NodeIterator_root_Getter";

  @DomName('NodeIterator.whatToShow')
  @DocsEditable
  int get whatToShow native "NodeIterator_whatToShow_Getter";

  @DomName('NodeIterator.detach')
  @DocsEditable
  void detach() native "NodeIterator_detach_Callback";

  @DomName('NodeIterator.nextNode')
  @DocsEditable
  Node nextNode() native "NodeIterator_nextNode_Callback";

  @DomName('NodeIterator.previousNode')
  @DocsEditable
  Node previousNode() native "NodeIterator_previousNode_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('NodeList')
class NodeList extends NativeFieldWrapperClass1 implements List<Node> {
  NodeList.internal();

  @DomName('NodeList.length')
  @DocsEditable
  int get length native "NodeList_length_Getter";

  Node operator[](int index) native "NodeList_item_Callback";

  void operator[]=(int index, Node value) {
    throw new UnsupportedError("Cannot assign element of immutable List.");
  }
  // -- start List<Node> mixins.
  // Node is the element type.

  // From Iterable<Node>:

  Iterator<Node> 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<Node>(this);
  }

  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, Node)) {
    return IterableMixinWorkaround.reduce(this, initialValue, combine);
  }

  bool contains(Node element) => IterableMixinWorkaround.contains(this, element);

  void forEach(void f(Node element)) => IterableMixinWorkaround.forEach(this, f);

  String join([String separator]) =>
      IterableMixinWorkaround.joinList(this, separator);

  Iterable map(f(Node element)) =>
      IterableMixinWorkaround.mapList(this, f);

  Iterable<Node> where(bool f(Node element)) =>
      IterableMixinWorkaround.where(this, f);

  Iterable expand(Iterable f(Node element)) =>
      IterableMixinWorkaround.expand(this, f);

  bool every(bool f(Node element)) => IterableMixinWorkaround.every(this, f);

  bool any(bool f(Node element)) => IterableMixinWorkaround.any(this, f);

  List<Node> toList({ bool growable: true }) =>
      new List<Node>.from(this, growable: growable);

  Set<Node> toSet() => new Set<Node>.from(this);

  bool get isEmpty => this.length == 0;

  Iterable<Node> take(int n) => IterableMixinWorkaround.takeList(this, n);

  Iterable<Node> takeWhile(bool test(Node value)) {
    return IterableMixinWorkaround.takeWhile(this, test);
  }

  Iterable<Node> skip(int n) => IterableMixinWorkaround.skipList(this, n);

  Iterable<Node> skipWhile(bool test(Node value)) {
    return IterableMixinWorkaround.skipWhile(this, test);
  }

  Node firstWhere(bool test(Node value), { Node orElse() }) {
    return IterableMixinWorkaround.firstWhere(this, test, orElse);
  }

  Node lastWhere(bool test(Node value), {Node orElse()}) {
    return IterableMixinWorkaround.lastWhereList(this, test, orElse);
  }

  Node singleWhere(bool test(Node value)) {
    return IterableMixinWorkaround.singleWhere(this, test);
  }

  Node elementAt(int index) {
    return this[index];
  }

  // From Collection<Node>:

  void add(Node value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(Node value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Iterable<Node> iterable) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  // From List<Node>:
  void set length(int value) {
    throw new UnsupportedError("Cannot resize immutable List.");
  }

  void clear() {
    throw new UnsupportedError("Cannot clear immutable List.");
  }

  Iterable<Node> get reversed {
    return IterableMixinWorkaround.reversedList(this);
  }

  void sort([int compare(Node a, Node b)]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(Node element, [int start = 0]) =>
      Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(Node element, [int start]) {
    if (start == null) start = length - 1;
    return Lists.lastIndexOf(this, element, start);
  }

  Node get first {
    if (this.length > 0) return this[0];
    throw new StateError("No elements");
  }

  Node get last {
    if (this.length > 0) return this[this.length - 1];
    throw new StateError("No elements");
  }

  Node get single {
    if (length == 1) return this[0];
    if (length == 0) throw new StateError("No elements");
    throw new StateError("More than one element");
  }

  Node min([int compare(Node a, Node b)]) =>
      IterableMixinWorkaround.min(this, compare);

  Node max([int compare(Node a, Node b)]) =>
      IterableMixinWorkaround.max(this, compare);

  void insert(int index, Node element) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  Node removeAt(int pos) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  Node removeLast() {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void remove(Object object) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void removeAll(Iterable elements) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void retainAll(Iterable elements) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void removeWhere(bool test(Node element)) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void retainWhere(bool test(Node element)) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void setRange(int start, int rangeLength, List<Node> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [Node initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<Node> sublist(int start, [int end]) {
    if (end == null) end = length;
    return Lists.getRange(this, start, end, <Node>[]);
  }

  List<Node> getRange(int start, int rangeLength) =>
      sublist(start, start + rangeLength);

  Map<int, Node> asMap() =>
    IterableMixinWorkaround.asMapList(this);

  // -- end List<Node> mixins.

  @DomName('NodeList.item')
  @DocsEditable
  Node _item(int index) native "NodeList_item_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('Notation')
class Notation extends Node {
  Notation.internal() : super.internal();

  @DomName('Notation.publicId')
  @DocsEditable
  String get publicId native "Notation_publicId_Getter";

  @DomName('Notation.systemId')
  @DocsEditable
  String get systemId native "Notation_systemId_Getter";

}
// 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.


@DocsEditable
@DomName('Notification')
class Notification extends EventTarget {
  Notification.internal() : super.internal();

  @DomName('Notification.clickEvent')
  @DocsEditable
  static const EventStreamProvider<Event> clickEvent = const EventStreamProvider<Event>('click');

  @DomName('Notification.closeEvent')
  @DocsEditable
  static const EventStreamProvider<Event> closeEvent = const EventStreamProvider<Event>('close');

  @DomName('Notification.displayEvent')
  @DocsEditable
  static const EventStreamProvider<Event> displayEvent = const EventStreamProvider<Event>('display');

  @DomName('Notification.errorEvent')
  @DocsEditable
  static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');

  @DomName('Notification.showEvent')
  @DocsEditable
  static const EventStreamProvider<Event> showEvent = const EventStreamProvider<Event>('show');

  @DomName('Notification.Notification')
  @DocsEditable
  factory Notification(String title, [Map options]) {
    return Notification._create_1(title, options);
  }

  @DocsEditable
  static Notification _create_1(title, options) native "Notification__create_1constructorCallback";

  @DomName('Notification.dir')
  @DocsEditable
  String get dir native "Notification_dir_Getter";

  @DomName('Notification.dir')
  @DocsEditable
  void set dir(String value) native "Notification_dir_Setter";

  @DomName('Notification.permission')
  @DocsEditable
  String get permission native "Notification_permission_Getter";

  @DomName('Notification.replaceId')
  @DocsEditable
  String get replaceId native "Notification_replaceId_Getter";

  @DomName('Notification.replaceId')
  @DocsEditable
  void set replaceId(String value) native "Notification_replaceId_Setter";

  @DomName('Notification.tag')
  @DocsEditable
  String get tag native "Notification_tag_Getter";

  @DomName('Notification.tag')
  @DocsEditable
  void set tag(String value) native "Notification_tag_Setter";

  @DomName('Notification.addEventListener')
  @DocsEditable
  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "Notification_addEventListener_Callback";

  @DomName('Notification.cancel')
  @DocsEditable
  void cancel() native "Notification_cancel_Callback";

  @DomName('Notification.close')
  @DocsEditable
  void close() native "Notification_close_Callback";

  @DomName('Notification.dispatchEvent')
  @DocsEditable
  bool dispatchEvent(Event evt) native "Notification_dispatchEvent_Callback";

  @DomName('Notification.removeEventListener')
  @DocsEditable
  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "Notification_removeEventListener_Callback";

  @DomName('Notification.requestPermission')
  @DocsEditable
  static void _requestPermission([_NotificationPermissionCallback callback]) native "Notification_requestPermission_Callback";

  static Future<String> requestPermission() {
    var completer = new Completer<String>();
    _requestPermission(
        (value) { completer.complete(value); });
    return completer.future;
  }

  @DomName('Notification.show')
  @DocsEditable
  void show() native "Notification_show_Callback";

  @DomName('Notification.onclick')
  @DocsEditable
  Stream<Event> get onClick => clickEvent.forTarget(this);

  @DomName('Notification.onclose')
  @DocsEditable
  Stream<Event> get onClose => closeEvent.forTarget(this);

  @DomName('Notification.ondisplay')
  @DocsEditable
  Stream<Event> get onDisplay => displayEvent.forTarget(this);

  @DomName('Notification.onerror')
  @DocsEditable
  Stream<Event> get onError => errorEvent.forTarget(this);

  @DomName('Notification.onshow')
  @DocsEditable
  Stream<Event> get onShow => showEvent.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.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('NotificationCenter')
@SupportedBrowser(SupportedBrowser.CHROME)
@SupportedBrowser(SupportedBrowser.SAFARI)
@Experimental
class NotificationCenter extends NativeFieldWrapperClass1 {
  NotificationCenter.internal();

  /// Checks if this type is supported on the current platform.
  static bool get supported => true;

  @DomName('NotificationCenter.checkPermission')
  @DocsEditable
  int checkPermission() native "NotificationCenter_checkPermission_Callback";

  @DomName('NotificationCenter.createHTMLNotification')
  @DocsEditable
  Notification createHtmlNotification(String url) native "NotificationCenter_createHTMLNotification_Callback";

  @DomName('NotificationCenter.createNotification')
  @DocsEditable
  Notification createNotification(String iconUrl, String title, String body) native "NotificationCenter_createNotification_Callback";

  @DomName('NotificationCenter.requestPermission')
  @DocsEditable
  void _requestPermission([VoidCallback callback]) native "NotificationCenter_requestPermission_Callback";

  Future requestPermission() {
    var completer = new Completer();
    _requestPermission(
        () { completer.complete(); });
    return completer.future;
  }

}
// 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.


typedef void _NotificationPermissionCallback(String permission);
// 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.


@DocsEditable
@DomName('HTMLOListElement')
class OListElement extends _Element_Merged {
  OListElement.internal() : super.internal();

  @DomName('HTMLOListElement.HTMLOListElement')
  @DocsEditable
  factory OListElement() => document.$dom_createElement("ol");

  @DomName('HTMLOListElement.reversed')
  @DocsEditable
  bool get reversed native "HTMLOListElement_reversed_Getter";

  @DomName('HTMLOListElement.reversed')
  @DocsEditable
  void set reversed(bool value) native "HTMLOListElement_reversed_Setter";

  @DomName('HTMLOListElement.start')
  @DocsEditable
  int get start native "HTMLOListElement_start_Getter";

  @DomName('HTMLOListElement.start')
  @DocsEditable
  void set start(int value) native "HTMLOListElement_start_Setter";

  @DomName('HTMLOListElement.type')
  @DocsEditable
  String get type native "HTMLOListElement_type_Getter";

  @DomName('HTMLOListElement.type')
  @DocsEditable
  void set type(String value) native "HTMLOListElement_type_Setter";

}
// 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.


@DocsEditable
@DomName('HTMLObjectElement')
@SupportedBrowser(SupportedBrowser.CHROME)
@SupportedBrowser(SupportedBrowser.IE)
@SupportedBrowser(SupportedBrowser.SAFARI)
class ObjectElement extends _Element_Merged {
  ObjectElement.internal() : super.internal();

  @DomName('HTMLObjectElement.HTMLObjectElement')
  @DocsEditable
  factory ObjectElement() => document.$dom_createElement("object");

  /// Checks if this type is supported on the current platform.
  static bool get supported => true;

  @DomName('HTMLObjectElement.code')
  @DocsEditable
  String get code native "HTMLObjectElement_code_Getter";

  @DomName('HTMLObjectElement.code')
  @DocsEditable
  void set code(String value) native "HTMLObjectElement_code_Setter";

  @DomName('HTMLObjectElement.data')
  @DocsEditable
  String get data native "HTMLObjectElement_data_Getter";

  @DomName('HTMLObjectElement.data')
  @DocsEditable
  void set data(String value) native "HTMLObjectElement_data_Setter";

  @DomName('HTMLObjectElement.form')
  @DocsEditable
  FormElement get form native "HTMLObjectElement_form_Getter";

  @DomName('HTMLObjectElement.height')
  @DocsEditable
  String get height native "HTMLObjectElement_height_Getter";

  @DomName('HTMLObjectElement.height')
  @DocsEditable
  void set height(String value) native "HTMLObjectElement_height_Setter";

  @DomName('HTMLObjectElement.name')
  @DocsEditable
  String get name native "HTMLObjectElement_name_Getter";

  @DomName('HTMLObjectElement.name')
  @DocsEditable
  void set name(String value) native "HTMLObjectElement_name_Setter";

  @DomName('HTMLObjectElement.type')
  @DocsEditable
  String get type native "HTMLObjectElement_type_Getter";

  @DomName('HTMLObjectElement.type')
  @DocsEditable
  void set type(String value) native "HTMLObjectElement_type_Setter";

  @DomName('HTMLObjectElement.useMap')
  @DocsEditable
  String get useMap native "HTMLObjectElement_useMap_Getter";

  @DomName('HTMLObjectElement.useMap')
  @DocsEditable
  void set useMap(String value) native "HTMLObjectElement_useMap_Setter";

  @DomName('HTMLObjectElement.validationMessage')
  @DocsEditable
  String get validationMessage native "HTMLObjectElement_validationMessage_Getter";

  @DomName('HTMLObjectElement.validity')
  @DocsEditable
  ValidityState get validity native "HTMLObjectElement_validity_Getter";

  @DomName('HTMLObjectElement.width')
  @DocsEditable
  String get width native "HTMLObjectElement_width_Getter";

  @DomName('HTMLObjectElement.width')
  @DocsEditable
  void set width(String value) native "HTMLObjectElement_width_Setter";

  @DomName('HTMLObjectElement.willValidate')
  @DocsEditable
  bool get willValidate native "HTMLObjectElement_willValidate_Getter";

  @DomName('HTMLObjectElement.checkValidity')
  @DocsEditable
  bool checkValidity() native "HTMLObjectElement_checkValidity_Callback";

  @DomName('HTMLObjectElement.setCustomValidity')
  @DocsEditable
  void setCustomValidity(String error) native "HTMLObjectElement_setCustomValidity_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('OESElementIndexUint')
class OesElementIndexUint extends NativeFieldWrapperClass1 {
  OesElementIndexUint.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.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('OESStandardDerivatives')
class OesStandardDerivatives extends NativeFieldWrapperClass1 {
  OesStandardDerivatives.internal();

  static const int FRAGMENT_SHADER_DERIVATIVE_HINT_OES = 0x8B8B;

}
// 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.


@DocsEditable
@DomName('OESTextureFloat')
class OesTextureFloat extends NativeFieldWrapperClass1 {
  OesTextureFloat.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.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('OESTextureHalfFloat')
class OesTextureHalfFloat extends NativeFieldWrapperClass1 {
  OesTextureHalfFloat.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.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('OESVertexArrayObject')
class OesVertexArrayObject extends NativeFieldWrapperClass1 {
  OesVertexArrayObject.internal();

  static const int VERTEX_ARRAY_BINDING_OES = 0x85B5;

  @DomName('OESVertexArrayObject.bindVertexArrayOES')
  @DocsEditable
  void bindVertexArray(WebGLVertexArrayObject arrayObject) native "OESVertexArrayObject_bindVertexArrayOES_Callback";

  @DomName('OESVertexArrayObject.createVertexArrayOES')
  @DocsEditable
  WebGLVertexArrayObject createVertexArray() native "OESVertexArrayObject_createVertexArrayOES_Callback";

  @DomName('OESVertexArrayObject.deleteVertexArrayOES')
  @DocsEditable
  void deleteVertexArray(WebGLVertexArrayObject arrayObject) native "OESVertexArrayObject_deleteVertexArrayOES_Callback";

  @DomName('OESVertexArrayObject.isVertexArrayOES')
  @DocsEditable
  bool isVertexArray(WebGLVertexArrayObject arrayObject) native "OESVertexArrayObject_isVertexArrayOES_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('HTMLOptGroupElement')
class OptGroupElement extends _Element_Merged {
  OptGroupElement.internal() : super.internal();

  @DomName('HTMLOptGroupElement.HTMLOptGroupElement')
  @DocsEditable
  factory OptGroupElement() => document.$dom_createElement("optgroup");

  @DomName('HTMLOptGroupElement.disabled')
  @DocsEditable
  bool get disabled native "HTMLOptGroupElement_disabled_Getter";

  @DomName('HTMLOptGroupElement.disabled')
  @DocsEditable
  void set disabled(bool value) native "HTMLOptGroupElement_disabled_Setter";

  @DomName('HTMLOptGroupElement.label')
  @DocsEditable
  String get label native "HTMLOptGroupElement_label_Getter";

  @DomName('HTMLOptGroupElement.label')
  @DocsEditable
  void set label(String value) native "HTMLOptGroupElement_label_Setter";

}
// 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.


@DocsEditable
@DomName('HTMLOptionElement')
class OptionElement extends _Element_Merged {
  OptionElement.internal() : super.internal();

  @DomName('HTMLOptionElement.HTMLOptionElement')
  @DocsEditable
  factory OptionElement([String data, String value, bool defaultSelected, bool selected]) {
    return OptionElement._create_1(data, value, defaultSelected, selected);
  }

  @DocsEditable
  static OptionElement _create_1(data, value, defaultSelected, selected) native "HTMLOptionElement__create_1constructorCallback";

  @DomName('HTMLOptionElement.defaultSelected')
  @DocsEditable
  bool get defaultSelected native "HTMLOptionElement_defaultSelected_Getter";

  @DomName('HTMLOptionElement.defaultSelected')
  @DocsEditable
  void set defaultSelected(bool value) native "HTMLOptionElement_defaultSelected_Setter";

  @DomName('HTMLOptionElement.disabled')
  @DocsEditable
  bool get disabled native "HTMLOptionElement_disabled_Getter";

  @DomName('HTMLOptionElement.disabled')
  @DocsEditable
  void set disabled(bool value) native "HTMLOptionElement_disabled_Setter";

  @DomName('HTMLOptionElement.form')
  @DocsEditable
  FormElement get form native "HTMLOptionElement_form_Getter";

  @DomName('HTMLOptionElement.index')
  @DocsEditable
  int get index native "HTMLOptionElement_index_Getter";

  @DomName('HTMLOptionElement.label')
  @DocsEditable
  String get label native "HTMLOptionElement_label_Getter";

  @DomName('HTMLOptionElement.label')
  @DocsEditable
  void set label(String value) native "HTMLOptionElement_label_Setter";

  @DomName('HTMLOptionElement.selected')
  @DocsEditable
  bool get selected native "HTMLOptionElement_selected_Getter";

  @DomName('HTMLOptionElement.selected')
  @DocsEditable
  void set selected(bool value) native "HTMLOptionElement_selected_Setter";

  @DomName('HTMLOptionElement.value')
  @DocsEditable
  String get value native "HTMLOptionElement_value_Getter";

  @DomName('HTMLOptionElement.value')
  @DocsEditable
  void set value(String value) native "HTMLOptionElement_value_Setter";

}
// 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.


@DocsEditable
@DomName('HTMLOutputElement')
@SupportedBrowser(SupportedBrowser.CHROME)
@SupportedBrowser(SupportedBrowser.FIREFOX)
@SupportedBrowser(SupportedBrowser.SAFARI)
class OutputElement extends _Element_Merged {
  OutputElement.internal() : super.internal();

  @DomName('HTMLOutputElement.HTMLOutputElement')
  @DocsEditable
  factory OutputElement() => document.$dom_createElement("output");

  /// Checks if this type is supported on the current platform.
  static bool get supported => true;

  @DomName('HTMLOutputElement.defaultValue')
  @DocsEditable
  String get defaultValue native "HTMLOutputElement_defaultValue_Getter";

  @DomName('HTMLOutputElement.defaultValue')
  @DocsEditable
  void set defaultValue(String value) native "HTMLOutputElement_defaultValue_Setter";

  @DomName('HTMLOutputElement.form')
  @DocsEditable
  FormElement get form native "HTMLOutputElement_form_Getter";

  @DomName('HTMLOutputElement.htmlFor')
  @DocsEditable
  DomSettableTokenList get htmlFor native "HTMLOutputElement_htmlFor_Getter";

  @DomName('HTMLOutputElement.labels')
  @DocsEditable
  List<Node> get labels native "HTMLOutputElement_labels_Getter";

  @DomName('HTMLOutputElement.name')
  @DocsEditable
  String get name native "HTMLOutputElement_name_Getter";

  @DomName('HTMLOutputElement.name')
  @DocsEditable
  void set name(String value) native "HTMLOutputElement_name_Setter";

  @DomName('HTMLOutputElement.type')
  @DocsEditable
  String get type native "HTMLOutputElement_type_Getter";

  @DomName('HTMLOutputElement.validationMessage')
  @DocsEditable
  String get validationMessage native "HTMLOutputElement_validationMessage_Getter";

  @DomName('HTMLOutputElement.validity')
  @DocsEditable
  ValidityState get validity native "HTMLOutputElement_validity_Getter";

  @DomName('HTMLOutputElement.value')
  @DocsEditable
  String get value native "HTMLOutputElement_value_Getter";

  @DomName('HTMLOutputElement.value')
  @DocsEditable
  void set value(String value) native "HTMLOutputElement_value_Setter";

  @DomName('HTMLOutputElement.willValidate')
  @DocsEditable
  bool get willValidate native "HTMLOutputElement_willValidate_Getter";

  @DomName('HTMLOutputElement.checkValidity')
  @DocsEditable
  bool checkValidity() native "HTMLOutputElement_checkValidity_Callback";

  @DomName('HTMLOutputElement.setCustomValidity')
  @DocsEditable
  void setCustomValidity(String error) native "HTMLOutputElement_setCustomValidity_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('OverflowEvent')
class OverflowEvent extends Event {
  OverflowEvent.internal() : super.internal();

  static const int BOTH = 2;

  static const int HORIZONTAL = 0;

  static const int VERTICAL = 1;

  @DomName('OverflowEvent.horizontalOverflow')
  @DocsEditable
  bool get horizontalOverflow native "OverflowEvent_horizontalOverflow_Getter";

  @DomName('OverflowEvent.orient')
  @DocsEditable
  int get orient native "OverflowEvent_orient_Getter";

  @DomName('OverflowEvent.verticalOverflow')
  @DocsEditable
  bool get verticalOverflow native "OverflowEvent_verticalOverflow_Getter";

}
// 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.


@DocsEditable
@DomName('PagePopupController')
class PagePopupController extends NativeFieldWrapperClass1 {
  PagePopupController.internal();

  @DomName('PagePopupController.closePopup')
  @DocsEditable
  void closePopup() native "PagePopupController_closePopup_Callback";

  @DomName('PagePopupController.formatMonth')
  @DocsEditable
  String formatMonth(int year, int zeroBaseMonth) native "PagePopupController_formatMonth_Callback";

  @DomName('PagePopupController.formatShortMonth')
  @DocsEditable
  String formatShortMonth(int year, int zeroBaseMonth) native "PagePopupController_formatShortMonth_Callback";

  @DomName('PagePopupController.histogramEnumeration')
  @DocsEditable
  void histogramEnumeration(String name, int sample, int boundaryValue) native "PagePopupController_histogramEnumeration_Callback";

  @DomName('PagePopupController.localizeNumberString')
  @DocsEditable
  String localizeNumberString(String numberString) native "PagePopupController_localizeNumberString_Callback";

  @DomName('PagePopupController.setValue')
  @DocsEditable
  void setValue(String value) native "PagePopupController_setValue_Callback";

  @DomName('PagePopupController.setValueAndClosePopup')
  @DocsEditable
  void setValueAndClosePopup(int numberValue, String stringValue) native "PagePopupController_setValueAndClosePopup_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('PageTransitionEvent')
class PageTransitionEvent extends Event {
  PageTransitionEvent.internal() : super.internal();

  @DomName('PageTransitionEvent.persisted')
  @DocsEditable
  bool get persisted native "PageTransitionEvent_persisted_Getter";

}
// 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.


@DocsEditable
@DomName('HTMLParagraphElement')
class ParagraphElement extends _Element_Merged {
  ParagraphElement.internal() : super.internal();

  @DomName('HTMLParagraphElement.HTMLParagraphElement')
  @DocsEditable
  factory ParagraphElement() => document.$dom_createElement("p");

}
// 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.


@DocsEditable
@DomName('HTMLParamElement')
class ParamElement extends _Element_Merged {
  ParamElement.internal() : super.internal();

  @DomName('HTMLParamElement.HTMLParamElement')
  @DocsEditable
  factory ParamElement() => document.$dom_createElement("param");

  @DomName('HTMLParamElement.name')
  @DocsEditable
  String get name native "HTMLParamElement_name_Getter";

  @DomName('HTMLParamElement.name')
  @DocsEditable
  void set name(String value) native "HTMLParamElement_name_Setter";

  @DomName('HTMLParamElement.value')
  @DocsEditable
  String get value native "HTMLParamElement_value_Getter";

  @DomName('HTMLParamElement.value')
  @DocsEditable
  void set value(String value) native "HTMLParamElement_value_Setter";

}
// 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.


@DocsEditable
@DomName('Performance')
@SupportedBrowser(SupportedBrowser.CHROME)
@SupportedBrowser(SupportedBrowser.FIREFOX)
@SupportedBrowser(SupportedBrowser.IE)
class Performance extends EventTarget {
  Performance.internal() : super.internal();

  /// Checks if this type is supported on the current platform.
  static bool get supported => true;

  @DomName('Performance.memory')
  @DocsEditable
  MemoryInfo get memory native "Performance_memory_Getter";

  @DomName('Performance.navigation')
  @DocsEditable
  PerformanceNavigation get navigation native "Performance_navigation_Getter";

  @DomName('Performance.timing')
  @DocsEditable
  PerformanceTiming get timing native "Performance_timing_Getter";

  @DomName('Performance.now')
  @DocsEditable
  num now() native "Performance_now_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('PerformanceNavigation')
class PerformanceNavigation extends NativeFieldWrapperClass1 {
  PerformanceNavigation.internal();

  static const int TYPE_BACK_FORWARD = 2;

  static const int TYPE_NAVIGATE = 0;

  static const int TYPE_RELOAD = 1;

  static const int TYPE_RESERVED = 255;

  @DomName('PerformanceNavigation.redirectCount')
  @DocsEditable
  int get redirectCount native "PerformanceNavigation_redirectCount_Getter";

  @DomName('PerformanceNavigation.type')
  @DocsEditable
  int get type native "PerformanceNavigation_type_Getter";

}
// 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.


@DocsEditable
@DomName('PerformanceTiming')
class PerformanceTiming extends NativeFieldWrapperClass1 {
  PerformanceTiming.internal();

  @DomName('PerformanceTiming.connectEnd')
  @DocsEditable
  int get connectEnd native "PerformanceTiming_connectEnd_Getter";

  @DomName('PerformanceTiming.connectStart')
  @DocsEditable
  int get connectStart native "PerformanceTiming_connectStart_Getter";

  @DomName('PerformanceTiming.domComplete')
  @DocsEditable
  int get domComplete native "PerformanceTiming_domComplete_Getter";

  @DomName('PerformanceTiming.domContentLoadedEventEnd')
  @DocsEditable
  int get domContentLoadedEventEnd native "PerformanceTiming_domContentLoadedEventEnd_Getter";

  @DomName('PerformanceTiming.domContentLoadedEventStart')
  @DocsEditable
  int get domContentLoadedEventStart native "PerformanceTiming_domContentLoadedEventStart_Getter";

  @DomName('PerformanceTiming.domInteractive')
  @DocsEditable
  int get domInteractive native "PerformanceTiming_domInteractive_Getter";

  @DomName('PerformanceTiming.domLoading')
  @DocsEditable
  int get domLoading native "PerformanceTiming_domLoading_Getter";

  @DomName('PerformanceTiming.domainLookupEnd')
  @DocsEditable
  int get domainLookupEnd native "PerformanceTiming_domainLookupEnd_Getter";

  @DomName('PerformanceTiming.domainLookupStart')
  @DocsEditable
  int get domainLookupStart native "PerformanceTiming_domainLookupStart_Getter";

  @DomName('PerformanceTiming.fetchStart')
  @DocsEditable
  int get fetchStart native "PerformanceTiming_fetchStart_Getter";

  @DomName('PerformanceTiming.loadEventEnd')
  @DocsEditable
  int get loadEventEnd native "PerformanceTiming_loadEventEnd_Getter";

  @DomName('PerformanceTiming.loadEventStart')
  @DocsEditable
  int get loadEventStart native "PerformanceTiming_loadEventStart_Getter";

  @DomName('PerformanceTiming.navigationStart')
  @DocsEditable
  int get navigationStart native "PerformanceTiming_navigationStart_Getter";

  @DomName('PerformanceTiming.redirectEnd')
  @DocsEditable
  int get redirectEnd native "PerformanceTiming_redirectEnd_Getter";

  @DomName('PerformanceTiming.redirectStart')
  @DocsEditable
  int get redirectStart native "PerformanceTiming_redirectStart_Getter";

  @DomName('PerformanceTiming.requestStart')
  @DocsEditable
  int get requestStart native "PerformanceTiming_requestStart_Getter";

  @DomName('PerformanceTiming.responseEnd')
  @DocsEditable
  int get responseEnd native "PerformanceTiming_responseEnd_Getter";

  @DomName('PerformanceTiming.responseStart')
  @DocsEditable
  int get responseStart native "PerformanceTiming_responseStart_Getter";

  @DomName('PerformanceTiming.secureConnectionStart')
  @DocsEditable
  int get secureConnectionStart native "PerformanceTiming_secureConnectionStart_Getter";

  @DomName('PerformanceTiming.unloadEventEnd')
  @DocsEditable
  int get unloadEventEnd native "PerformanceTiming_unloadEventEnd_Getter";

  @DomName('PerformanceTiming.unloadEventStart')
  @DocsEditable
  int get unloadEventStart native "PerformanceTiming_unloadEventStart_Getter";

}
// 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.


@DocsEditable
@DomName('PopStateEvent')
@SupportedBrowser(SupportedBrowser.CHROME)
@SupportedBrowser(SupportedBrowser.FIREFOX)
@SupportedBrowser(SupportedBrowser.IE, '10')
@SupportedBrowser(SupportedBrowser.SAFARI)
class PopStateEvent extends Event {
  PopStateEvent.internal() : super.internal();

  @DomName('PopStateEvent.state')
  @DocsEditable
  Object get state native "PopStateEvent_state_Getter";

}
// 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.


typedef void _PositionCallback(Geoposition position);
// 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.


@DocsEditable
@DomName('PositionError')
class PositionError extends NativeFieldWrapperClass1 {
  PositionError.internal();

  static const int PERMISSION_DENIED = 1;

  static const int POSITION_UNAVAILABLE = 2;

  static const int TIMEOUT = 3;

  @DomName('PositionError.code')
  @DocsEditable
  int get code native "PositionError_code_Getter";

  @DomName('PositionError.message')
  @DocsEditable
  String get message native "PositionError_message_Getter";

}
// 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.


typedef void _PositionErrorCallback(PositionError error);
// 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.


@DocsEditable
@DomName('HTMLPreElement')
class PreElement extends _Element_Merged {
  PreElement.internal() : super.internal();

  @DomName('HTMLPreElement.HTMLPreElement')
  @DocsEditable
  factory PreElement() => document.$dom_createElement("pre");

  @DomName('HTMLPreElement.wrap')
  @DocsEditable
  bool get wrap native "HTMLPreElement_wrap_Getter";

  @DomName('HTMLPreElement.wrap')
  @DocsEditable
  void set wrap(bool value) native "HTMLPreElement_wrap_Setter";

}
// 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.


@DocsEditable
@DomName('ProcessingInstruction')
class ProcessingInstruction extends Node {
  ProcessingInstruction.internal() : super.internal();

  @DomName('ProcessingInstruction.data')
  @DocsEditable
  String get data native "ProcessingInstruction_data_Getter";

  @DomName('ProcessingInstruction.data')
  @DocsEditable
  void set data(String value) native "ProcessingInstruction_data_Setter";

  @DomName('ProcessingInstruction.sheet')
  @DocsEditable
  StyleSheet get sheet native "ProcessingInstruction_sheet_Getter";

  @DomName('ProcessingInstruction.target')
  @DocsEditable
  String get target native "ProcessingInstruction_target_Getter";

}
// 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.


@DocsEditable
@DomName('HTMLProgressElement')
@SupportedBrowser(SupportedBrowser.CHROME)
@SupportedBrowser(SupportedBrowser.FIREFOX)
@SupportedBrowser(SupportedBrowser.IE, '10')
@SupportedBrowser(SupportedBrowser.SAFARI)
class ProgressElement extends _Element_Merged {
  ProgressElement.internal() : super.internal();

  @DomName('HTMLProgressElement.HTMLProgressElement')
  @DocsEditable
  factory ProgressElement() => document.$dom_createElement("progress");

  /// Checks if this type is supported on the current platform.
  static bool get supported => true;

  @DomName('HTMLProgressElement.labels')
  @DocsEditable
  List<Node> get labels native "HTMLProgressElement_labels_Getter";

  @DomName('HTMLProgressElement.max')
  @DocsEditable
  num get max native "HTMLProgressElement_max_Getter";

  @DomName('HTMLProgressElement.max')
  @DocsEditable
  void set max(num value) native "HTMLProgressElement_max_Setter";

  @DomName('HTMLProgressElement.position')
  @DocsEditable
  num get position native "HTMLProgressElement_position_Getter";

  @DomName('HTMLProgressElement.value')
  @DocsEditable
  num get value native "HTMLProgressElement_value_Getter";

  @DomName('HTMLProgressElement.value')
  @DocsEditable
  void set value(num value) native "HTMLProgressElement_value_Setter";

}
// 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.


@DocsEditable
@DomName('ProgressEvent')
class ProgressEvent extends Event {
  ProgressEvent.internal() : super.internal();

  @DomName('ProgressEvent.lengthComputable')
  @DocsEditable
  bool get lengthComputable native "ProgressEvent_lengthComputable_Getter";

  @DomName('ProgressEvent.loaded')
  @DocsEditable
  int get loaded native "ProgressEvent_loaded_Getter";

  @DomName('ProgressEvent.total')
  @DocsEditable
  int get total native "ProgressEvent_total_Getter";

}
// 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.


@DocsEditable
@DomName('HTMLQuoteElement')
class QuoteElement extends _Element_Merged {
  QuoteElement.internal() : super.internal();

  @DomName('HTMLQuoteElement.cite')
  @DocsEditable
  String get cite native "HTMLQuoteElement_cite_Getter";

  @DomName('HTMLQuoteElement.cite')
  @DocsEditable
  void set cite(String value) native "HTMLQuoteElement_cite_Setter";

}
// 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.


typedef void _RtcErrorCallback(String errorInformation);
// 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.


typedef void _RtcSessionDescriptionCallback(RtcSessionDescription sdp);
// 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.


typedef void RtcStatsCallback(RtcStatsResponse response);
// 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.


@DocsEditable
@DomName('RadioNodeList')
class RadioNodeList extends NodeList {
  RadioNodeList.internal() : super.internal();

  @DomName('RadioNodeList.value')
  @DocsEditable
  String get value native "RadioNodeList_value_Getter";

  @DomName('RadioNodeList.value')
  @DocsEditable
  void set value(String value) native "RadioNodeList_value_Setter";

}
// 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')
class Range extends NativeFieldWrapperClass1 {
  factory Range() => document.$dom_createRange();

  Range.internal();

  static const int END_TO_END = 2;

  static const int END_TO_START = 3;

  static const int NODE_AFTER = 1;

  static const int NODE_BEFORE = 0;

  static const int NODE_BEFORE_AND_AFTER = 2;

  static const int NODE_INSIDE = 3;

  static const int START_TO_END = 1;

  static const int START_TO_START = 0;

  @DomName('Range.collapsed')
  @DocsEditable
  bool get collapsed native "Range_collapsed_Getter";

  @DomName('Range.commonAncestorContainer')
  @DocsEditable
  Node get commonAncestorContainer native "Range_commonAncestorContainer_Getter";

  @DomName('Range.endContainer')
  @DocsEditable
  Node get endContainer native "Range_endContainer_Getter";

  @DomName('Range.endOffset')
  @DocsEditable
  int get endOffset native "Range_endOffset_Getter";

  @DomName('Range.startContainer')
  @DocsEditable
  Node get startContainer native "Range_startContainer_Getter";

  @DomName('Range.startOffset')
  @DocsEditable
  int get startOffset native "Range_startOffset_Getter";

  @DomName('Range.cloneContents')
  @DocsEditable
  DocumentFragment cloneContents() native "Range_cloneContents_Callback";

  @DomName('Range.cloneRange')
  @DocsEditable
  Range cloneRange() native "Range_cloneRange_Callback";

  @DomName('Range.collapse')
  @DocsEditable
  void collapse(bool toStart) native "Range_collapse_Callback";

  @DomName('Range.compareNode')
  @DocsEditable
  int compareNode(Node refNode) native "Range_compareNode_Callback";

  @DomName('Range.comparePoint')
  @DocsEditable
  int comparePoint(Node refNode, int offset) native "Range_comparePoint_Callback";

  @DomName('Range.createContextualFragment')
  @DocsEditable
  DocumentFragment createContextualFragment(String html) native "Range_createContextualFragment_Callback";

  @DomName('Range.deleteContents')
  @DocsEditable
  void deleteContents() native "Range_deleteContents_Callback";

  @DomName('Range.detach')
  @DocsEditable
  void detach() native "Range_detach_Callback";

  @DomName('Range.expand')
  @DocsEditable
  void expand(String unit) native "Range_expand_Callback";

  @DomName('Range.extractContents')
  @DocsEditable
  DocumentFragment extractContents() native "Range_extractContents_Callback";

  @DomName('Range.getBoundingClientRect')
  @DocsEditable
  Rect getBoundingClientRect() native "Range_getBoundingClientRect_Callback";

  @DomName('Range.getClientRects')
  @DocsEditable
  List<Rect> getClientRects() native "Range_getClientRects_Callback";

  @DomName('Range.insertNode')
  @DocsEditable
  void insertNode(Node newNode) native "Range_insertNode_Callback";

  @DomName('Range.intersectsNode')
  @DocsEditable
  bool intersectsNode(Node refNode) native "Range_intersectsNode_Callback";

  @DomName('Range.isPointInRange')
  @DocsEditable
  bool isPointInRange(Node refNode, int offset) native "Range_isPointInRange_Callback";

  @DomName('Range.selectNode')
  @DocsEditable
  void selectNode(Node refNode) native "Range_selectNode_Callback";

  @DomName('Range.selectNodeContents')
  @DocsEditable
  void selectNodeContents(Node refNode) native "Range_selectNodeContents_Callback";

  @DomName('Range.setEnd')
  @DocsEditable
  void setEnd(Node refNode, int offset) native "Range_setEnd_Callback";

  @DomName('Range.setEndAfter')
  @DocsEditable
  void setEndAfter(Node refNode) native "Range_setEndAfter_Callback";

  @DomName('Range.setEndBefore')
  @DocsEditable
  void setEndBefore(Node refNode) native "Range_setEndBefore_Callback";

  @DomName('Range.setStart')
  @DocsEditable
  void setStart(Node refNode, int offset) native "Range_setStart_Callback";

  @DomName('Range.setStartAfter')
  @DocsEditable
  void setStartAfter(Node refNode) native "Range_setStartAfter_Callback";

  @DomName('Range.setStartBefore')
  @DocsEditable
  void setStartBefore(Node refNode) native "Range_setStartBefore_Callback";

  @DomName('Range.surroundContents')
  @DocsEditable
  void surroundContents(Node newParent) native "Range_surroundContents_Callback";

  @DomName('Range.toString')
  @DocsEditable
  String toString() native "Range_toString_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('RangeException')
class RangeException extends NativeFieldWrapperClass1 {
  RangeException.internal();

  static const int BAD_BOUNDARYPOINTS_ERR = 1;

  static const int INVALID_NODE_TYPE_ERR = 2;

  @DomName('RangeException.code')
  @DocsEditable
  int get code native "RangeException_code_Getter";

  @DomName('RangeException.message')
  @DocsEditable
  String get message native "RangeException_message_Getter";

  @DomName('RangeException.name')
  @DocsEditable
  String get name native "RangeException_name_Getter";

  @DomName('RangeException.toString')
  @DocsEditable
  String toString() native "RangeException_toString_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


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.


@DocsEditable
@DomName('RTCDataChannel')
class RtcDataChannel extends EventTarget {
  RtcDataChannel.internal() : super.internal();

  @DomName('RTCDataChannel.closeEvent')
  @DocsEditable
  static const EventStreamProvider<Event> closeEvent = const EventStreamProvider<Event>('close');

  @DomName('RTCDataChannel.errorEvent')
  @DocsEditable
  static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');

  @DomName('RTCDataChannel.messageEvent')
  @DocsEditable
  static const EventStreamProvider<MessageEvent> messageEvent = const EventStreamProvider<MessageEvent>('message');

  @DomName('RTCDataChannel.openEvent')
  @DocsEditable
  static const EventStreamProvider<Event> openEvent = const EventStreamProvider<Event>('open');

  @DomName('RTCDataChannel.binaryType')
  @DocsEditable
  String get binaryType native "RTCDataChannel_binaryType_Getter";

  @DomName('RTCDataChannel.binaryType')
  @DocsEditable
  void set binaryType(String value) native "RTCDataChannel_binaryType_Setter";

  @DomName('RTCDataChannel.bufferedAmount')
  @DocsEditable
  int get bufferedAmount native "RTCDataChannel_bufferedAmount_Getter";

  @DomName('RTCDataChannel.label')
  @DocsEditable
  String get label native "RTCDataChannel_label_Getter";

  @DomName('RTCDataChannel.readyState')
  @DocsEditable
  String get readyState native "RTCDataChannel_readyState_Getter";

  @DomName('RTCDataChannel.reliable')
  @DocsEditable
  bool get reliable native "RTCDataChannel_reliable_Getter";

  @DomName('RTCDataChannel.addEventListener')
  @DocsEditable
  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "RTCDataChannel_addEventListener_Callback";

  @DomName('RTCDataChannel.close')
  @DocsEditable
  void close() native "RTCDataChannel_close_Callback";

  @DomName('RTCDataChannel.dispatchEvent')
  @DocsEditable
  bool dispatchEvent(Event event) native "RTCDataChannel_dispatchEvent_Callback";

  @DomName('RTCDataChannel.removeEventListener')
  @DocsEditable
  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "RTCDataChannel_removeEventListener_Callback";

  void send(data) {
    if ((data is ArrayBufferView || data is _typeddata.TypedData || data == null)) {
      _send_1(data);
      return;
    }
    if ((data is ArrayBuffer || data is _typeddata.ByteBuffer || data == null)) {
      _send_2(data);
      return;
    }
    if ((data is Blob || data == null)) {
      _send_3(data);
      return;
    }
    if ((data is String || data == null)) {
      _send_4(data);
      return;
    }
    throw new ArgumentError("Incorrect number or type of arguments");
  }

  @DomName('RTCDataChannel._send_1')
  @DocsEditable
  void _send_1(data) native "RTCDataChannel__send_1_Callback";

  @DomName('RTCDataChannel._send_2')
  @DocsEditable
  void _send_2(data) native "RTCDataChannel__send_2_Callback";

  @DomName('RTCDataChannel._send_3')
  @DocsEditable
  void _send_3(data) native "RTCDataChannel__send_3_Callback";

  @DomName('RTCDataChannel._send_4')
  @DocsEditable
  void _send_4(data) native "RTCDataChannel__send_4_Callback";

  @DomName('RTCDataChannel.onclose')
  @DocsEditable
  Stream<Event> get onClose => closeEvent.forTarget(this);

  @DomName('RTCDataChannel.onerror')
  @DocsEditable
  Stream<Event> get onError => errorEvent.forTarget(this);

  @DomName('RTCDataChannel.onmessage')
  @DocsEditable
  Stream<MessageEvent> get onMessage => messageEvent.forTarget(this);

  @DomName('RTCDataChannel.onopen')
  @DocsEditable
  Stream<Event> get onOpen => openEvent.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.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('RTCDataChannelEvent')
class RtcDataChannelEvent extends Event {
  RtcDataChannelEvent.internal() : super.internal();

  @DomName('RTCDataChannelEvent.channel')
  @DocsEditable
  RtcDataChannel get channel native "RTCDataChannelEvent_channel_Getter";

}
// 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.


@DocsEditable
@DomName('RTCIceCandidate')
@SupportedBrowser(SupportedBrowser.CHROME)
@Experimental
class RtcIceCandidate extends NativeFieldWrapperClass1 {
  RtcIceCandidate.internal();

  @DomName('RTCIceCandidate.RTCIceCandidate')
  @DocsEditable
  factory RtcIceCandidate(Map dictionary) {
    return RtcIceCandidate._create_1(dictionary);
  }

  @DocsEditable
  static RtcIceCandidate _create_1(dictionary) native "RTCIceCandidate__create_1constructorCallback";

  @DomName('RTCIceCandidate.candidate')
  @DocsEditable
  String get candidate native "RTCIceCandidate_candidate_Getter";

  @DomName('RTCIceCandidate.sdpMLineIndex')
  @DocsEditable
  int get sdpMLineIndex native "RTCIceCandidate_sdpMLineIndex_Getter";

  @DomName('RTCIceCandidate.sdpMid')
  @DocsEditable
  String get sdpMid native "RTCIceCandidate_sdpMid_Getter";

}
// 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.


@DocsEditable
@DomName('RTCIceCandidateEvent')
class RtcIceCandidateEvent extends Event {
  RtcIceCandidateEvent.internal() : super.internal();

  @DomName('RTCIceCandidateEvent.candidate')
  @DocsEditable
  RtcIceCandidate get candidate native "RTCIceCandidateEvent_candidate_Getter";

}
// 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.


@DomName('RTCPeerConnection')
@SupportedBrowser(SupportedBrowser.CHROME)
@Experimental
class RtcPeerConnection extends EventTarget {

  /**
   * Checks if Real Time Communication (RTC) APIs are supported and enabled on
   * the current platform.
   */
  static bool get supported => true;
  RtcPeerConnection.internal() : super.internal();

  @DomName('RTCPeerConnection.addstreamEvent')
  @DocsEditable
  static const EventStreamProvider<MediaStreamEvent> addStreamEvent = const EventStreamProvider<MediaStreamEvent>('addstream');

  @DomName('RTCPeerConnection.datachannelEvent')
  @DocsEditable
  static const EventStreamProvider<RtcDataChannelEvent> dataChannelEvent = const EventStreamProvider<RtcDataChannelEvent>('datachannel');

  @DomName('RTCPeerConnection.gatheringchangeEvent')
  @DocsEditable
  static const EventStreamProvider<Event> gatheringChangeEvent = const EventStreamProvider<Event>('gatheringchange');

  @DomName('RTCPeerConnection.icecandidateEvent')
  @DocsEditable
  static const EventStreamProvider<RtcIceCandidateEvent> iceCandidateEvent = const EventStreamProvider<RtcIceCandidateEvent>('icecandidate');

  @DomName('RTCPeerConnection.icechangeEvent')
  @DocsEditable
  static const EventStreamProvider<Event> iceChangeEvent = const EventStreamProvider<Event>('icechange');

  @DomName('RTCPeerConnection.negotiationneededEvent')
  @DocsEditable
  static const EventStreamProvider<Event> negotiationNeededEvent = const EventStreamProvider<Event>('negotiationneeded');

  @DomName('RTCPeerConnection.removestreamEvent')
  @DocsEditable
  static const EventStreamProvider<MediaStreamEvent> removeStreamEvent = const EventStreamProvider<MediaStreamEvent>('removestream');

  @DomName('RTCPeerConnection.statechangeEvent')
  @DocsEditable
  static const EventStreamProvider<Event> stateChangeEvent = const EventStreamProvider<Event>('statechange');

  @DomName('RTCPeerConnection.RTCPeerConnection')
  @DocsEditable
  factory RtcPeerConnection(Map rtcIceServers, [Map mediaConstraints]) {
    return RtcPeerConnection._create_1(rtcIceServers, mediaConstraints);
  }

  @DocsEditable
  static RtcPeerConnection _create_1(rtcIceServers, mediaConstraints) native "RTCPeerConnection__create_1constructorCallback";

  @DomName('RTCPeerConnection.iceConnectionState')
  @DocsEditable
  String get iceConnectionState native "RTCPeerConnection_iceConnectionState_Getter";

  @DomName('RTCPeerConnection.iceGatheringState')
  @DocsEditable
  String get iceGatheringState native "RTCPeerConnection_iceGatheringState_Getter";

  @DomName('RTCPeerConnection.localDescription')
  @DocsEditable
  RtcSessionDescription get localDescription native "RTCPeerConnection_localDescription_Getter";

  @DomName('RTCPeerConnection.readyState')
  @DocsEditable
  String get readyState native "RTCPeerConnection_readyState_Getter";

  @DomName('RTCPeerConnection.remoteDescription')
  @DocsEditable
  RtcSessionDescription get remoteDescription native "RTCPeerConnection_remoteDescription_Getter";

  @DomName('RTCPeerConnection.signalingState')
  @DocsEditable
  String get signalingState native "RTCPeerConnection_signalingState_Getter";

  @DomName('RTCPeerConnection.addEventListener')
  @DocsEditable
  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "RTCPeerConnection_addEventListener_Callback";

  @DomName('RTCPeerConnection.addIceCandidate')
  @DocsEditable
  void addIceCandidate(RtcIceCandidate candidate) native "RTCPeerConnection_addIceCandidate_Callback";

  @DomName('RTCPeerConnection.addStream')
  @DocsEditable
  void addStream(MediaStream stream, [Map mediaConstraints]) native "RTCPeerConnection_addStream_Callback";

  @DomName('RTCPeerConnection.close')
  @DocsEditable
  void close() native "RTCPeerConnection_close_Callback";

  @DomName('RTCPeerConnection.createAnswer')
  @DocsEditable
  void _createAnswer(_RtcSessionDescriptionCallback successCallback, [_RtcErrorCallback failureCallback, Map mediaConstraints]) native "RTCPeerConnection_createAnswer_Callback";

  Future<RtcSessionDescription> createAnswer([Map mediaConstraints]) {
    var completer = new Completer<RtcSessionDescription>();
    _createAnswer(mediaConstraints,
        (value) { completer.complete(value); },
        (error) { completer.completeError(error); });
    return completer.future;
  }

  @DomName('RTCPeerConnection.createDTMFSender')
  @DocsEditable
  RtcdtmfSender createDtmfSender(MediaStreamTrack track) native "RTCPeerConnection_createDTMFSender_Callback";

  @DomName('RTCPeerConnection.createDataChannel')
  @DocsEditable
  RtcDataChannel createDataChannel(String label, [Map options]) native "RTCPeerConnection_createDataChannel_Callback";

  @DomName('RTCPeerConnection.createOffer')
  @DocsEditable
  void _createOffer(_RtcSessionDescriptionCallback successCallback, [_RtcErrorCallback failureCallback, Map mediaConstraints]) native "RTCPeerConnection_createOffer_Callback";

  Future<RtcSessionDescription> createOffer([Map mediaConstraints]) {
    var completer = new Completer<RtcSessionDescription>();
    _createOffer(mediaConstraints,
        (value) { completer.complete(value); },
        (error) { completer.completeError(error); });
    return completer.future;
  }

  @DomName('RTCPeerConnection.dispatchEvent')
  @DocsEditable
  bool dispatchEvent(Event event) native "RTCPeerConnection_dispatchEvent_Callback";

  @DomName('RTCPeerConnection.getLocalStreams')
  @DocsEditable
  List<MediaStream> getLocalStreams() native "RTCPeerConnection_getLocalStreams_Callback";

  @DomName('RTCPeerConnection.getRemoteStreams')
  @DocsEditable
  List<MediaStream> getRemoteStreams() native "RTCPeerConnection_getRemoteStreams_Callback";

  @DomName('RTCPeerConnection.getStats')
  @DocsEditable
  void getStats(RtcStatsCallback successCallback, MediaStreamTrack selector) native "RTCPeerConnection_getStats_Callback";

  @DomName('RTCPeerConnection.removeEventListener')
  @DocsEditable
  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "RTCPeerConnection_removeEventListener_Callback";

  @DomName('RTCPeerConnection.removeStream')
  @DocsEditable
  void removeStream(MediaStream stream) native "RTCPeerConnection_removeStream_Callback";

  @DomName('RTCPeerConnection.setLocalDescription')
  @DocsEditable
  void _setLocalDescription(RtcSessionDescription description, [VoidCallback successCallback, _RtcErrorCallback failureCallback]) native "RTCPeerConnection_setLocalDescription_Callback";

  Future setLocalDescription(RtcSessionDescription description) {
    var completer = new Completer();
    _setLocalDescription(description,
        () { completer.complete(); },
        (error) { completer.completeError(error); });
    return completer.future;
  }

  @DomName('RTCPeerConnection.setRemoteDescription')
  @DocsEditable
  void _setRemoteDescription(RtcSessionDescription description, [VoidCallback successCallback, _RtcErrorCallback failureCallback]) native "RTCPeerConnection_setRemoteDescription_Callback";

  Future setRemoteDescription(RtcSessionDescription description) {
    var completer = new Completer();
    _setRemoteDescription(description,
        () { completer.complete(); },
        (error) { completer.completeError(error); });
    return completer.future;
  }

  @DomName('RTCPeerConnection.updateIce')
  @DocsEditable
  void updateIce([Map configuration, Map mediaConstraints]) native "RTCPeerConnection_updateIce_Callback";

  @DomName('RTCPeerConnection.onaddstream')
  @DocsEditable
  Stream<MediaStreamEvent> get onAddStream => addStreamEvent.forTarget(this);

  @DomName('RTCPeerConnection.ondatachannel')
  @DocsEditable
  Stream<RtcDataChannelEvent> get onDataChannel => dataChannelEvent.forTarget(this);

  @DomName('RTCPeerConnection.ongatheringchange')
  @DocsEditable
  Stream<Event> get onGatheringChange => gatheringChangeEvent.forTarget(this);

  @DomName('RTCPeerConnection.onicecandidate')
  @DocsEditable
  Stream<RtcIceCandidateEvent> get onIceCandidate => iceCandidateEvent.forTarget(this);

  @DomName('RTCPeerConnection.onicechange')
  @DocsEditable
  Stream<Event> get onIceChange => iceChangeEvent.forTarget(this);

  @DomName('RTCPeerConnection.onnegotiationneeded')
  @DocsEditable
  Stream<Event> get onNegotiationNeeded => negotiationNeededEvent.forTarget(this);

  @DomName('RTCPeerConnection.onremovestream')
  @DocsEditable
  Stream<MediaStreamEvent> get onRemoveStream => removeStreamEvent.forTarget(this);

  @DomName('RTCPeerConnection.onstatechange')
  @DocsEditable
  Stream<Event> get onStateChange => stateChangeEvent.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.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('RTCSessionDescription')
@SupportedBrowser(SupportedBrowser.CHROME)
@Experimental
class RtcSessionDescription extends NativeFieldWrapperClass1 {
  RtcSessionDescription.internal();

  @DomName('RTCSessionDescription.RTCSessionDescription')
  @DocsEditable
  factory RtcSessionDescription(Map dictionary) {
    return RtcSessionDescription._create_1(dictionary);
  }

  @DocsEditable
  static RtcSessionDescription _create_1(dictionary) native "RTCSessionDescription__create_1constructorCallback";

  @DomName('RTCSessionDescription.sdp')
  @DocsEditable
  String get sdp native "RTCSessionDescription_sdp_Getter";

  @DomName('RTCSessionDescription.sdp')
  @DocsEditable
  void set sdp(String value) native "RTCSessionDescription_sdp_Setter";

  @DomName('RTCSessionDescription.type')
  @DocsEditable
  String get type native "RTCSessionDescription_type_Getter";

  @DomName('RTCSessionDescription.type')
  @DocsEditable
  void set type(String value) native "RTCSessionDescription_type_Setter";

}
// 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.


@DocsEditable
@DomName('RTCStatsElement')
class RtcStatsElement extends NativeFieldWrapperClass1 {
  RtcStatsElement.internal();

  @DomName('RTCStatsElement.timestamp')
  @DocsEditable
  DateTime get timestamp native "RTCStatsElement_timestamp_Getter";

  @DomName('RTCStatsElement.names')
  @DocsEditable
  List<String> names() native "RTCStatsElement_names_Callback";

  @DomName('RTCStatsElement.stat')
  @DocsEditable
  String stat(String name) native "RTCStatsElement_stat_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('RTCStatsReport')
class RtcStatsReport extends NativeFieldWrapperClass1 {
  RtcStatsReport.internal();

  @DomName('RTCStatsReport.local')
  @DocsEditable
  RtcStatsElement get local native "RTCStatsReport_local_Getter";

  @DomName('RTCStatsReport.remote')
  @DocsEditable
  RtcStatsElement get remote native "RTCStatsReport_remote_Getter";

}
// 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.


@DocsEditable
@DomName('RTCStatsResponse')
class RtcStatsResponse extends NativeFieldWrapperClass1 {
  RtcStatsResponse.internal();

  @DomName('RTCStatsResponse.result')
  @DocsEditable
  List<RtcStatsReport> result() native "RTCStatsResponse_result_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('RTCDTMFSender')
class RtcdtmfSender extends EventTarget {
  RtcdtmfSender.internal() : super.internal();

  @DomName('RTCDTMFSender.canInsertDTMF')
  @DocsEditable
  bool get canInsertDtmf native "RTCDTMFSender_canInsertDTMF_Getter";

  @DomName('RTCDTMFSender.duration')
  @DocsEditable
  int get duration native "RTCDTMFSender_duration_Getter";

  @DomName('RTCDTMFSender.interToneGap')
  @DocsEditable
  int get interToneGap native "RTCDTMFSender_interToneGap_Getter";

  @DomName('RTCDTMFSender.toneBuffer')
  @DocsEditable
  String get toneBuffer native "RTCDTMFSender_toneBuffer_Getter";

  @DomName('RTCDTMFSender.track')
  @DocsEditable
  MediaStreamTrack get track native "RTCDTMFSender_track_Getter";

  @DomName('RTCDTMFSender.addEventListener')
  @DocsEditable
  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "RTCDTMFSender_addEventListener_Callback";

  @DomName('RTCDTMFSender.dispatchEvent')
  @DocsEditable
  bool dispatchEvent(Event event) native "RTCDTMFSender_dispatchEvent_Callback";

  void insertDtmf(String tones, [int duration, int interToneGap]) {
    if (?interToneGap) {
      _insertDTMF_1(tones, duration, interToneGap);
      return;
    }
    if (?duration) {
      _insertDTMF_2(tones, duration);
      return;
    }
    _insertDTMF_3(tones);
    return;
  }

  @DomName('RTCDTMFSender._insertDTMF_1')
  @DocsEditable
  void _insertDTMF_1(tones, duration, interToneGap) native "RTCDTMFSender__insertDTMF_1_Callback";

  @DomName('RTCDTMFSender._insertDTMF_2')
  @DocsEditable
  void _insertDTMF_2(tones, duration) native "RTCDTMFSender__insertDTMF_2_Callback";

  @DomName('RTCDTMFSender._insertDTMF_3')
  @DocsEditable
  void _insertDTMF_3(tones) native "RTCDTMFSender__insertDTMF_3_Callback";

  @DomName('RTCDTMFSender.removeEventListener')
  @DocsEditable
  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "RTCDTMFSender_removeEventListener_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('RTCDTMFToneChangeEvent')
class RtcdtmfToneChangeEvent extends Event {
  RtcdtmfToneChangeEvent.internal() : super.internal();

  @DomName('RTCDTMFToneChangeEvent.tone')
  @DocsEditable
  String get tone native "RTCDTMFToneChangeEvent_tone_Getter";

}
// 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('Screen')
class Screen extends NativeFieldWrapperClass1 {

  @DomName('Screen.availHeight')
  @DomName('Screen.availLeft')
  @DomName('Screen.availTop')
  @DomName('Screen.availWidth')
  Rect get available => new Rect($dom_availLeft, $dom_availTop, $dom_availWidth,
      $dom_availHeight);
  Screen.internal();

  @DomName('Screen.availHeight')
  @DocsEditable
  int get $dom_availHeight native "Screen_availHeight_Getter";

  @DomName('Screen.availLeft')
  @DocsEditable
  int get $dom_availLeft native "Screen_availLeft_Getter";

  @DomName('Screen.availTop')
  @DocsEditable
  int get $dom_availTop native "Screen_availTop_Getter";

  @DomName('Screen.availWidth')
  @DocsEditable
  int get $dom_availWidth native "Screen_availWidth_Getter";

  @DomName('Screen.colorDepth')
  @DocsEditable
  int get colorDepth native "Screen_colorDepth_Getter";

  @DomName('Screen.height')
  @DocsEditable
  int get height native "Screen_height_Getter";

  @DomName('Screen.pixelDepth')
  @DocsEditable
  int get pixelDepth native "Screen_pixelDepth_Getter";

  @DomName('Screen.width')
  @DocsEditable
  int get width native "Screen_width_Getter";
}
// 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.


@DocsEditable
@DomName('HTMLScriptElement')
class ScriptElement extends _Element_Merged {
  ScriptElement.internal() : super.internal();

  @DomName('HTMLScriptElement.HTMLScriptElement')
  @DocsEditable
  factory ScriptElement() => document.$dom_createElement("script");

  @DomName('HTMLScriptElement.async')
  @DocsEditable
  bool get async native "HTMLScriptElement_async_Getter";

  @DomName('HTMLScriptElement.async')
  @DocsEditable
  void set async(bool value) native "HTMLScriptElement_async_Setter";

  @DomName('HTMLScriptElement.charset')
  @DocsEditable
  String get charset native "HTMLScriptElement_charset_Getter";

  @DomName('HTMLScriptElement.charset')
  @DocsEditable
  void set charset(String value) native "HTMLScriptElement_charset_Setter";

  @DomName('HTMLScriptElement.crossOrigin')
  @DocsEditable
  String get crossOrigin native "HTMLScriptElement_crossOrigin_Getter";

  @DomName('HTMLScriptElement.crossOrigin')
  @DocsEditable
  void set crossOrigin(String value) native "HTMLScriptElement_crossOrigin_Setter";

  @DomName('HTMLScriptElement.defer')
  @DocsEditable
  bool get defer native "HTMLScriptElement_defer_Getter";

  @DomName('HTMLScriptElement.defer')
  @DocsEditable
  void set defer(bool value) native "HTMLScriptElement_defer_Setter";

  @DomName('HTMLScriptElement.event')
  @DocsEditable
  String get event native "HTMLScriptElement_event_Getter";

  @DomName('HTMLScriptElement.event')
  @DocsEditable
  void set event(String value) native "HTMLScriptElement_event_Setter";

  @DomName('HTMLScriptElement.htmlFor')
  @DocsEditable
  String get htmlFor native "HTMLScriptElement_htmlFor_Getter";

  @DomName('HTMLScriptElement.htmlFor')
  @DocsEditable
  void set htmlFor(String value) native "HTMLScriptElement_htmlFor_Setter";

  @DomName('HTMLScriptElement.src')
  @DocsEditable
  String get src native "HTMLScriptElement_src_Getter";

  @DomName('HTMLScriptElement.src')
  @DocsEditable
  void set src(String value) native "HTMLScriptElement_src_Setter";

  @DomName('HTMLScriptElement.type')
  @DocsEditable
  String get type native "HTMLScriptElement_type_Getter";

  @DomName('HTMLScriptElement.type')
  @DocsEditable
  void set type(String value) native "HTMLScriptElement_type_Setter";

}
// 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.


@DocsEditable
@DomName('ScriptProfile')
class ScriptProfile extends NativeFieldWrapperClass1 {
  ScriptProfile.internal();

  @DomName('ScriptProfile.head')
  @DocsEditable
  ScriptProfileNode get head native "ScriptProfile_head_Getter";

  @DomName('ScriptProfile.idleTime')
  @DocsEditable
  num get idleTime native "ScriptProfile_idleTime_Getter";

  @DomName('ScriptProfile.title')
  @DocsEditable
  String get title native "ScriptProfile_title_Getter";

  @DomName('ScriptProfile.uid')
  @DocsEditable
  int get uid native "ScriptProfile_uid_Getter";

}
// 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.


@DocsEditable
@DomName('ScriptProfileNode')
class ScriptProfileNode extends NativeFieldWrapperClass1 {
  ScriptProfileNode.internal();

  @DomName('ScriptProfileNode.callUID')
  @DocsEditable
  int get callUid native "ScriptProfileNode_callUID_Getter";

  @DomName('ScriptProfileNode.functionName')
  @DocsEditable
  String get functionName native "ScriptProfileNode_functionName_Getter";

  @DomName('ScriptProfileNode.lineNumber')
  @DocsEditable
  int get lineNumber native "ScriptProfileNode_lineNumber_Getter";

  @DomName('ScriptProfileNode.numberOfCalls')
  @DocsEditable
  int get numberOfCalls native "ScriptProfileNode_numberOfCalls_Getter";

  @DomName('ScriptProfileNode.selfTime')
  @DocsEditable
  num get selfTime native "ScriptProfileNode_selfTime_Getter";

  @DomName('ScriptProfileNode.totalTime')
  @DocsEditable
  num get totalTime native "ScriptProfileNode_totalTime_Getter";

  @DomName('ScriptProfileNode.url')
  @DocsEditable
  String get url native "ScriptProfileNode_url_Getter";

  @DomName('ScriptProfileNode.visible')
  @DocsEditable
  bool get visible native "ScriptProfileNode_visible_Getter";

  @DomName('ScriptProfileNode.children')
  @DocsEditable
  List<ScriptProfileNode> children() native "ScriptProfileNode_children_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.


@DomName('HTMLSelectElement')
class SelectElement extends _Element_Merged {
  SelectElement.internal() : super.internal();

  @DomName('HTMLSelectElement.HTMLSelectElement')
  @DocsEditable
  factory SelectElement() => document.$dom_createElement("select");

  @DomName('HTMLSelectElement.autofocus')
  @DocsEditable
  bool get autofocus native "HTMLSelectElement_autofocus_Getter";

  @DomName('HTMLSelectElement.autofocus')
  @DocsEditable
  void set autofocus(bool value) native "HTMLSelectElement_autofocus_Setter";

  @DomName('HTMLSelectElement.disabled')
  @DocsEditable
  bool get disabled native "HTMLSelectElement_disabled_Getter";

  @DomName('HTMLSelectElement.disabled')
  @DocsEditable
  void set disabled(bool value) native "HTMLSelectElement_disabled_Setter";

  @DomName('HTMLSelectElement.form')
  @DocsEditable
  FormElement get form native "HTMLSelectElement_form_Getter";

  @DomName('HTMLSelectElement.labels')
  @DocsEditable
  List<Node> get labels native "HTMLSelectElement_labels_Getter";

  @DomName('HTMLSelectElement.length')
  @DocsEditable
  int get length native "HTMLSelectElement_length_Getter";

  @DomName('HTMLSelectElement.length')
  @DocsEditable
  void set length(int value) native "HTMLSelectElement_length_Setter";

  @DomName('HTMLSelectElement.multiple')
  @DocsEditable
  bool get multiple native "HTMLSelectElement_multiple_Getter";

  @DomName('HTMLSelectElement.multiple')
  @DocsEditable
  void set multiple(bool value) native "HTMLSelectElement_multiple_Setter";

  @DomName('HTMLSelectElement.name')
  @DocsEditable
  String get name native "HTMLSelectElement_name_Getter";

  @DomName('HTMLSelectElement.name')
  @DocsEditable
  void set name(String value) native "HTMLSelectElement_name_Setter";

  @DomName('HTMLSelectElement.required')
  @DocsEditable
  bool get required native "HTMLSelectElement_required_Getter";

  @DomName('HTMLSelectElement.required')
  @DocsEditable
  void set required(bool value) native "HTMLSelectElement_required_Setter";

  @DomName('HTMLSelectElement.selectedIndex')
  @DocsEditable
  int get selectedIndex native "HTMLSelectElement_selectedIndex_Getter";

  @DomName('HTMLSelectElement.selectedIndex')
  @DocsEditable
  void set selectedIndex(int value) native "HTMLSelectElement_selectedIndex_Setter";

  @DomName('HTMLSelectElement.size')
  @DocsEditable
  int get size native "HTMLSelectElement_size_Getter";

  @DomName('HTMLSelectElement.size')
  @DocsEditable
  void set size(int value) native "HTMLSelectElement_size_Setter";

  @DomName('HTMLSelectElement.type')
  @DocsEditable
  String get type native "HTMLSelectElement_type_Getter";

  @DomName('HTMLSelectElement.validationMessage')
  @DocsEditable
  String get validationMessage native "HTMLSelectElement_validationMessage_Getter";

  @DomName('HTMLSelectElement.validity')
  @DocsEditable
  ValidityState get validity native "HTMLSelectElement_validity_Getter";

  @DomName('HTMLSelectElement.value')
  @DocsEditable
  String get value native "HTMLSelectElement_value_Getter";

  @DomName('HTMLSelectElement.value')
  @DocsEditable
  void set value(String value) native "HTMLSelectElement_value_Setter";

  @DomName('HTMLSelectElement.willValidate')
  @DocsEditable
  bool get willValidate native "HTMLSelectElement_willValidate_Getter";

  @DomName('HTMLSelectElement.checkValidity')
  @DocsEditable
  bool checkValidity() native "HTMLSelectElement_checkValidity_Callback";

  @DomName('HTMLSelectElement.item')
  @DocsEditable
  Node item(int index) native "HTMLSelectElement_item_Callback";

  @DomName('HTMLSelectElement.namedItem')
  @DocsEditable
  Node namedItem(String name) native "HTMLSelectElement_namedItem_Callback";

  @DomName('HTMLSelectElement.setCustomValidity')
  @DocsEditable
  void setCustomValidity(String error) native "HTMLSelectElement_setCustomValidity_Callback";


  // Override default options, since IE returns SelectElement itself and it
  // does not operate as a List.
  List<OptionElement> get options {
    var options = this.children.where((e) => e is OptionElement).toList();
    return new UnmodifiableListView<OptionElement>(options);
  }

  List<OptionElement> get selectedOptions {
    // IE does not change the selected flag for single-selection items.
    if (this.multiple) {
      var options = this.options.where((o) => o.selected).toList();
      return new UnmodifiableListView<OptionElement>(options);
    } else {
      return [this.options[this.selectedIndex]];
    }
  }
}
// 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.


@DocsEditable
@DomName('HTMLShadowElement')
@SupportedBrowser(SupportedBrowser.CHROME, '26')
@Experimental
class ShadowElement extends _Element_Merged {
  ShadowElement.internal() : super.internal();

  /// Checks if this type is supported on the current platform.
  static bool get supported => true;

  @DomName('HTMLShadowElement.olderShadowRoot')
  @DocsEditable
  ShadowRoot get olderShadowRoot native "HTMLShadowElement_olderShadowRoot_Getter";

  @DomName('HTMLShadowElement.resetStyleInheritance')
  @DocsEditable
  bool get resetStyleInheritance native "HTMLShadowElement_resetStyleInheritance_Getter";

  @DomName('HTMLShadowElement.resetStyleInheritance')
  @DocsEditable
  void set resetStyleInheritance(bool value) native "HTMLShadowElement_resetStyleInheritance_Setter";

}
// 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
class ShadowRoot extends DocumentFragment {
  ShadowRoot.internal() : super.internal();

  @DomName('ShadowRoot.activeElement')
  @DocsEditable
  Element get activeElement native "ShadowRoot_activeElement_Getter";

  @DomName('ShadowRoot.applyAuthorStyles')
  @DocsEditable
  bool get applyAuthorStyles native "ShadowRoot_applyAuthorStyles_Getter";

  @DomName('ShadowRoot.applyAuthorStyles')
  @DocsEditable
  void set applyAuthorStyles(bool value) native "ShadowRoot_applyAuthorStyles_Setter";

  @DomName('ShadowRoot.innerHTML')
  @DocsEditable
  String get innerHtml native "ShadowRoot_innerHTML_Getter";

  @DomName('ShadowRoot.innerHTML')
  @DocsEditable
  void set innerHtml(String value) native "ShadowRoot_innerHTML_Setter";

  @DomName('ShadowRoot.resetStyleInheritance')
  @DocsEditable
  bool get resetStyleInheritance native "ShadowRoot_resetStyleInheritance_Getter";

  @DomName('ShadowRoot.resetStyleInheritance')
  @DocsEditable
  void set resetStyleInheritance(bool value) native "ShadowRoot_resetStyleInheritance_Setter";

  @DomName('ShadowRoot.cloneNode')
  @DocsEditable
  Node clone(bool deep) native "ShadowRoot_cloneNode_Callback";

  @DomName('ShadowRoot.elementFromPoint')
  @DocsEditable
  Element elementFromPoint(int x, int y) native "ShadowRoot_elementFromPoint_Callback";

  @DomName('ShadowRoot.getElementById')
  @DocsEditable
  Element getElementById(String elementId) native "ShadowRoot_getElementById_Callback";

  @DomName('ShadowRoot.getElementsByClassName')
  @DocsEditable
  List<Node> getElementsByClassName(String className) native "ShadowRoot_getElementsByClassName_Callback";

  @DomName('ShadowRoot.getElementsByTagName')
  @DocsEditable
  List<Node> getElementsByTagName(String tagName) native "ShadowRoot_getElementsByTagName_Callback";

  @DomName('ShadowRoot.getSelection')
  @DocsEditable
  DomSelection getSelection() native "ShadowRoot_getSelection_Callback";

  static bool get supported => _Utils.shadowRootSupported(window.document);
}
// 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.


@DocsEditable
@DomName('SharedWorker')
class SharedWorker extends AbstractWorker {
  SharedWorker.internal() : super.internal();

  @DomName('SharedWorker.SharedWorker')
  @DocsEditable
  factory SharedWorker(String scriptURL, [String name]) {
    return SharedWorker._create_1(scriptURL, name);
  }

  @DocsEditable
  static SharedWorker _create_1(scriptURL, name) native "SharedWorker__create_1constructorCallback";

  @DomName('SharedWorker.port')
  @DocsEditable
  MessagePort get port native "SharedWorker_port_Getter";

}
// 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.


@DocsEditable
@DomName('SharedWorkerContext')
class SharedWorkerContext extends WorkerContext {
  SharedWorkerContext.internal() : super.internal();

  @DomName('SharedWorkerContext.connectEvent')
  @DocsEditable
  static const EventStreamProvider<Event> connectEvent = const EventStreamProvider<Event>('connect');

  @DomName('SharedWorkerContext.name')
  @DocsEditable
  String get name native "SharedWorkerContext_name_Getter";

  @DomName('SharedWorkerContext.onconnect')
  @DocsEditable
  Stream<Event> get onConnect => connectEvent.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.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('SourceBuffer')
class SourceBuffer extends NativeFieldWrapperClass1 {
  SourceBuffer.internal();

  @DomName('SourceBuffer.buffered')
  @DocsEditable
  TimeRanges get buffered native "SourceBuffer_buffered_Getter";

  @DomName('SourceBuffer.timestampOffset')
  @DocsEditable
  num get timestampOffset native "SourceBuffer_timestampOffset_Getter";

  @DomName('SourceBuffer.timestampOffset')
  @DocsEditable
  void set timestampOffset(num value) native "SourceBuffer_timestampOffset_Setter";

  @DomName('SourceBuffer.abort')
  @DocsEditable
  void abort() native "SourceBuffer_abort_Callback";

  @DomName('SourceBuffer.append')
  @DocsEditable
  void append(List<int> data) native "SourceBuffer_append_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('SourceBufferList')
class SourceBufferList extends EventTarget implements List<SourceBuffer> {
  SourceBufferList.internal() : super.internal();

  @DomName('SourceBufferList.length')
  @DocsEditable
  int get length native "SourceBufferList_length_Getter";

  SourceBuffer operator[](int index) native "SourceBufferList_item_Callback";

  void operator[]=(int index, SourceBuffer value) {
    throw new UnsupportedError("Cannot assign element of immutable List.");
  }
  // -- start List<SourceBuffer> mixins.
  // SourceBuffer is the element type.

  // From Iterable<SourceBuffer>:

  Iterator<SourceBuffer> 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<SourceBuffer>(this);
  }

  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, SourceBuffer)) {
    return IterableMixinWorkaround.reduce(this, initialValue, combine);
  }

  bool contains(SourceBuffer element) => IterableMixinWorkaround.contains(this, element);

  void forEach(void f(SourceBuffer element)) => IterableMixinWorkaround.forEach(this, f);

  String join([String separator]) =>
      IterableMixinWorkaround.joinList(this, separator);

  Iterable map(f(SourceBuffer element)) =>
      IterableMixinWorkaround.mapList(this, f);

  Iterable<SourceBuffer> where(bool f(SourceBuffer element)) =>
      IterableMixinWorkaround.where(this, f);

  Iterable expand(Iterable f(SourceBuffer element)) =>
      IterableMixinWorkaround.expand(this, f);

  bool every(bool f(SourceBuffer element)) => IterableMixinWorkaround.every(this, f);

  bool any(bool f(SourceBuffer element)) => IterableMixinWorkaround.any(this, f);

  List<SourceBuffer> toList({ bool growable: true }) =>
      new List<SourceBuffer>.from(this, growable: growable);

  Set<SourceBuffer> toSet() => new Set<SourceBuffer>.from(this);

  bool get isEmpty => this.length == 0;

  Iterable<SourceBuffer> take(int n) => IterableMixinWorkaround.takeList(this, n);

  Iterable<SourceBuffer> takeWhile(bool test(SourceBuffer value)) {
    return IterableMixinWorkaround.takeWhile(this, test);
  }

  Iterable<SourceBuffer> skip(int n) => IterableMixinWorkaround.skipList(this, n);

  Iterable<SourceBuffer> skipWhile(bool test(SourceBuffer value)) {
    return IterableMixinWorkaround.skipWhile(this, test);
  }

  SourceBuffer firstWhere(bool test(SourceBuffer value), { SourceBuffer orElse() }) {
    return IterableMixinWorkaround.firstWhere(this, test, orElse);
  }

  SourceBuffer lastWhere(bool test(SourceBuffer value), {SourceBuffer orElse()}) {
    return IterableMixinWorkaround.lastWhereList(this, test, orElse);
  }

  SourceBuffer singleWhere(bool test(SourceBuffer value)) {
    return IterableMixinWorkaround.singleWhere(this, test);
  }

  SourceBuffer elementAt(int index) {
    return this[index];
  }

  // From Collection<SourceBuffer>:

  void add(SourceBuffer value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(SourceBuffer value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Iterable<SourceBuffer> iterable) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  // From List<SourceBuffer>:
  void set length(int value) {
    throw new UnsupportedError("Cannot resize immutable List.");
  }

  void clear() {
    throw new UnsupportedError("Cannot clear immutable List.");
  }

  Iterable<SourceBuffer> get reversed {
    return IterableMixinWorkaround.reversedList(this);
  }

  void sort([int compare(SourceBuffer a, SourceBuffer b)]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(SourceBuffer element, [int start = 0]) =>
      Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(SourceBuffer element, [int start]) {
    if (start == null) start = length - 1;
    return Lists.lastIndexOf(this, element, start);
  }

  SourceBuffer get first {
    if (this.length > 0) return this[0];
    throw new StateError("No elements");
  }

  SourceBuffer get last {
    if (this.length > 0) return this[this.length - 1];
    throw new StateError("No elements");
  }

  SourceBuffer get single {
    if (length == 1) return this[0];
    if (length == 0) throw new StateError("No elements");
    throw new StateError("More than one element");
  }

  SourceBuffer min([int compare(SourceBuffer a, SourceBuffer b)]) =>
      IterableMixinWorkaround.min(this, compare);

  SourceBuffer max([int compare(SourceBuffer a, SourceBuffer b)]) =>
      IterableMixinWorkaround.max(this, compare);

  void insert(int index, SourceBuffer element) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  SourceBuffer removeAt(int pos) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  SourceBuffer removeLast() {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void remove(Object object) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void removeAll(Iterable elements) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void retainAll(Iterable elements) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void removeWhere(bool test(SourceBuffer element)) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void retainWhere(bool test(SourceBuffer element)) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void setRange(int start, int rangeLength, List<SourceBuffer> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [SourceBuffer initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<SourceBuffer> sublist(int start, [int end]) {
    if (end == null) end = length;
    return Lists.getRange(this, start, end, <SourceBuffer>[]);
  }

  List<SourceBuffer> getRange(int start, int rangeLength) =>
      sublist(start, start + rangeLength);

  Map<int, SourceBuffer> asMap() =>
    IterableMixinWorkaround.asMapList(this);

  // -- end List<SourceBuffer> mixins.

  @DomName('SourceBufferList.addEventListener')
  @DocsEditable
  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "SourceBufferList_addEventListener_Callback";

  @DomName('SourceBufferList.dispatchEvent')
  @DocsEditable
  bool dispatchEvent(Event event) native "SourceBufferList_dispatchEvent_Callback";

  @DomName('SourceBufferList.item')
  @DocsEditable
  SourceBuffer item(int index) native "SourceBufferList_item_Callback";

  @DomName('SourceBufferList.removeEventListener')
  @DocsEditable
  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "SourceBufferList_removeEventListener_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('HTMLSourceElement')
class SourceElement extends _Element_Merged {
  SourceElement.internal() : super.internal();

  @DomName('HTMLSourceElement.HTMLSourceElement')
  @DocsEditable
  factory SourceElement() => document.$dom_createElement("source");

  @DomName('HTMLSourceElement.media')
  @DocsEditable
  String get media native "HTMLSourceElement_media_Getter";

  @DomName('HTMLSourceElement.media')
  @DocsEditable
  void set media(String value) native "HTMLSourceElement_media_Setter";

  @DomName('HTMLSourceElement.src')
  @DocsEditable
  String get src native "HTMLSourceElement_src_Getter";

  @DomName('HTMLSourceElement.src')
  @DocsEditable
  void set src(String value) native "HTMLSourceElement_src_Setter";

  @DomName('HTMLSourceElement.type')
  @DocsEditable
  String get type native "HTMLSourceElement_type_Getter";

  @DomName('HTMLSourceElement.type')
  @DocsEditable
  void set type(String value) native "HTMLSourceElement_type_Setter";

}
// 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.


@DocsEditable
@DomName('HTMLSpanElement')
class SpanElement extends _Element_Merged {
  SpanElement.internal() : super.internal();

  @DomName('HTMLSpanElement.HTMLSpanElement')
  @DocsEditable
  factory SpanElement() => document.$dom_createElement("span");

}
// 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.


@DocsEditable
@DomName('SpeechGrammar')
class SpeechGrammar extends NativeFieldWrapperClass1 {
  SpeechGrammar.internal();

  @DomName('SpeechGrammar.SpeechGrammar')
  @DocsEditable
  factory SpeechGrammar() {
    return SpeechGrammar._create_1();
  }

  @DocsEditable
  static SpeechGrammar _create_1() native "SpeechGrammar__create_1constructorCallback";

  @DomName('SpeechGrammar.src')
  @DocsEditable
  String get src native "SpeechGrammar_src_Getter";

  @DomName('SpeechGrammar.src')
  @DocsEditable
  void set src(String value) native "SpeechGrammar_src_Setter";

  @DomName('SpeechGrammar.weight')
  @DocsEditable
  num get weight native "SpeechGrammar_weight_Getter";

  @DomName('SpeechGrammar.weight')
  @DocsEditable
  void set weight(num value) native "SpeechGrammar_weight_Setter";

}
// 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.


@DocsEditable
@DomName('SpeechGrammarList')
class SpeechGrammarList extends NativeFieldWrapperClass1 implements List<SpeechGrammar> {
  SpeechGrammarList.internal();

  @DomName('SpeechGrammarList.SpeechGrammarList')
  @DocsEditable
  factory SpeechGrammarList() {
    return SpeechGrammarList._create_1();
  }

  @DocsEditable
  static SpeechGrammarList _create_1() native "SpeechGrammarList__create_1constructorCallback";

  @DomName('SpeechGrammarList.length')
  @DocsEditable
  int get length native "SpeechGrammarList_length_Getter";

  SpeechGrammar operator[](int index) native "SpeechGrammarList_item_Callback";

  void operator[]=(int index, SpeechGrammar value) {
    throw new UnsupportedError("Cannot assign element of immutable List.");
  }
  // -- start List<SpeechGrammar> mixins.
  // SpeechGrammar is the element type.

  // From Iterable<SpeechGrammar>:

  Iterator<SpeechGrammar> 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<SpeechGrammar>(this);
  }

  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, SpeechGrammar)) {
    return IterableMixinWorkaround.reduce(this, initialValue, combine);
  }

  bool contains(SpeechGrammar element) => IterableMixinWorkaround.contains(this, element);

  void forEach(void f(SpeechGrammar element)) => IterableMixinWorkaround.forEach(this, f);

  String join([String separator]) =>
      IterableMixinWorkaround.joinList(this, separator);

  Iterable map(f(SpeechGrammar element)) =>
      IterableMixinWorkaround.mapList(this, f);

  Iterable<SpeechGrammar> where(bool f(SpeechGrammar element)) =>
      IterableMixinWorkaround.where(this, f);

  Iterable expand(Iterable f(SpeechGrammar element)) =>
      IterableMixinWorkaround.expand(this, f);

  bool every(bool f(SpeechGrammar element)) => IterableMixinWorkaround.every(this, f);

  bool any(bool f(SpeechGrammar element)) => IterableMixinWorkaround.any(this, f);

  List<SpeechGrammar> toList({ bool growable: true }) =>
      new List<SpeechGrammar>.from(this, growable: growable);

  Set<SpeechGrammar> toSet() => new Set<SpeechGrammar>.from(this);

  bool get isEmpty => this.length == 0;

  Iterable<SpeechGrammar> take(int n) => IterableMixinWorkaround.takeList(this, n);

  Iterable<SpeechGrammar> takeWhile(bool test(SpeechGrammar value)) {
    return IterableMixinWorkaround.takeWhile(this, test);
  }

  Iterable<SpeechGrammar> skip(int n) => IterableMixinWorkaround.skipList(this, n);

  Iterable<SpeechGrammar> skipWhile(bool test(SpeechGrammar value)) {
    return IterableMixinWorkaround.skipWhile(this, test);
  }

  SpeechGrammar firstWhere(bool test(SpeechGrammar value), { SpeechGrammar orElse() }) {
    return IterableMixinWorkaround.firstWhere(this, test, orElse);
  }

  SpeechGrammar lastWhere(bool test(SpeechGrammar value), {SpeechGrammar orElse()}) {
    return IterableMixinWorkaround.lastWhereList(this, test, orElse);
  }

  SpeechGrammar singleWhere(bool test(SpeechGrammar value)) {
    return IterableMixinWorkaround.singleWhere(this, test);
  }

  SpeechGrammar elementAt(int index) {
    return this[index];
  }

  // From Collection<SpeechGrammar>:

  void add(SpeechGrammar value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(SpeechGrammar value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Iterable<SpeechGrammar> iterable) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  // From List<SpeechGrammar>:
  void set length(int value) {
    throw new UnsupportedError("Cannot resize immutable List.");
  }

  void clear() {
    throw new UnsupportedError("Cannot clear immutable List.");
  }

  Iterable<SpeechGrammar> get reversed {
    return IterableMixinWorkaround.reversedList(this);
  }

  void sort([int compare(SpeechGrammar a, SpeechGrammar b)]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(SpeechGrammar element, [int start = 0]) =>
      Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(SpeechGrammar element, [int start]) {
    if (start == null) start = length - 1;
    return Lists.lastIndexOf(this, element, start);
  }

  SpeechGrammar get first {
    if (this.length > 0) return this[0];
    throw new StateError("No elements");
  }

  SpeechGrammar get last {
    if (this.length > 0) return this[this.length - 1];
    throw new StateError("No elements");
  }

  SpeechGrammar get single {
    if (length == 1) return this[0];
    if (length == 0) throw new StateError("No elements");
    throw new StateError("More than one element");
  }

  SpeechGrammar min([int compare(SpeechGrammar a, SpeechGrammar b)]) =>
      IterableMixinWorkaround.min(this, compare);

  SpeechGrammar max([int compare(SpeechGrammar a, SpeechGrammar b)]) =>
      IterableMixinWorkaround.max(this, compare);

  void insert(int index, SpeechGrammar element) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  SpeechGrammar removeAt(int pos) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  SpeechGrammar removeLast() {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void remove(Object object) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void removeAll(Iterable elements) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void retainAll(Iterable elements) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void removeWhere(bool test(SpeechGrammar element)) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void retainWhere(bool test(SpeechGrammar element)) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void setRange(int start, int rangeLength, List<SpeechGrammar> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [SpeechGrammar initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<SpeechGrammar> sublist(int start, [int end]) {
    if (end == null) end = length;
    return Lists.getRange(this, start, end, <SpeechGrammar>[]);
  }

  List<SpeechGrammar> getRange(int start, int rangeLength) =>
      sublist(start, start + rangeLength);

  Map<int, SpeechGrammar> asMap() =>
    IterableMixinWorkaround.asMapList(this);

  // -- end List<SpeechGrammar> mixins.

  void addFromString(String string, [num weight]) {
    if (?weight) {
      _addFromString_1(string, weight);
      return;
    }
    _addFromString_2(string);
    return;
  }

  @DomName('SpeechGrammarList._addFromString_1')
  @DocsEditable
  void _addFromString_1(string, weight) native "SpeechGrammarList__addFromString_1_Callback";

  @DomName('SpeechGrammarList._addFromString_2')
  @DocsEditable
  void _addFromString_2(string) native "SpeechGrammarList__addFromString_2_Callback";

  void addFromUri(String src, [num weight]) {
    if (?weight) {
      _addFromUri_1(src, weight);
      return;
    }
    _addFromUri_2(src);
    return;
  }

  @DomName('SpeechGrammarList._addFromUri_1')
  @DocsEditable
  void _addFromUri_1(src, weight) native "SpeechGrammarList__addFromUri_1_Callback";

  @DomName('SpeechGrammarList._addFromUri_2')
  @DocsEditable
  void _addFromUri_2(src) native "SpeechGrammarList__addFromUri_2_Callback";

  @DomName('SpeechGrammarList.item')
  @DocsEditable
  SpeechGrammar item(int index) native "SpeechGrammarList_item_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('SpeechInputEvent')
class SpeechInputEvent extends Event {
  SpeechInputEvent.internal() : super.internal();

  @DomName('SpeechInputEvent.results')
  @DocsEditable
  List<SpeechInputResult> get results native "SpeechInputEvent_results_Getter";

}
// 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.


@DocsEditable
@DomName('SpeechInputResult')
class SpeechInputResult extends NativeFieldWrapperClass1 {
  SpeechInputResult.internal();

  @DomName('SpeechInputResult.confidence')
  @DocsEditable
  num get confidence native "SpeechInputResult_confidence_Getter";

  @DomName('SpeechInputResult.utterance')
  @DocsEditable
  String get utterance native "SpeechInputResult_utterance_Getter";

}
// 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.


@DocsEditable
@DomName('SpeechRecognition')
@SupportedBrowser(SupportedBrowser.CHROME, '25')
@Experimental
class SpeechRecognition extends EventTarget {
  SpeechRecognition.internal() : super.internal();

  @DomName('SpeechRecognition.audioendEvent')
  @DocsEditable
  static const EventStreamProvider<Event> audioEndEvent = const EventStreamProvider<Event>('audioend');

  @DomName('SpeechRecognition.audiostartEvent')
  @DocsEditable
  static const EventStreamProvider<Event> audioStartEvent = const EventStreamProvider<Event>('audiostart');

  @DomName('SpeechRecognition.endEvent')
  @DocsEditable
  static const EventStreamProvider<Event> endEvent = const EventStreamProvider<Event>('end');

  @DomName('SpeechRecognition.errorEvent')
  @DocsEditable
  static const EventStreamProvider<SpeechRecognitionError> errorEvent = const EventStreamProvider<SpeechRecognitionError>('error');

  @DomName('SpeechRecognition.nomatchEvent')
  @DocsEditable
  static const EventStreamProvider<SpeechRecognitionEvent> noMatchEvent = const EventStreamProvider<SpeechRecognitionEvent>('nomatch');

  @DomName('SpeechRecognition.resultEvent')
  @DocsEditable
  static const EventStreamProvider<SpeechRecognitionEvent> resultEvent = const EventStreamProvider<SpeechRecognitionEvent>('result');

  @DomName('SpeechRecognition.soundendEvent')
  @DocsEditable
  static const EventStreamProvider<Event> soundEndEvent = const EventStreamProvider<Event>('soundend');

  @DomName('SpeechRecognition.soundstartEvent')
  @DocsEditable
  static const EventStreamProvider<Event> soundStartEvent = const EventStreamProvider<Event>('soundstart');

  @DomName('SpeechRecognition.speechendEvent')
  @DocsEditable
  static const EventStreamProvider<Event> speechEndEvent = const EventStreamProvider<Event>('speechend');

  @DomName('SpeechRecognition.speechstartEvent')
  @DocsEditable
  static const EventStreamProvider<Event> speechStartEvent = const EventStreamProvider<Event>('speechstart');

  @DomName('SpeechRecognition.startEvent')
  @DocsEditable
  static const EventStreamProvider<Event> startEvent = const EventStreamProvider<Event>('start');

  @DomName('SpeechRecognition.SpeechRecognition')
  @DocsEditable
  factory SpeechRecognition() {
    return SpeechRecognition._create_1();
  }

  @DocsEditable
  static SpeechRecognition _create_1() native "SpeechRecognition__create_1constructorCallback";

  /// Checks if this type is supported on the current platform.
  static bool get supported => true;

  @DomName('SpeechRecognition.continuous')
  @DocsEditable
  bool get continuous native "SpeechRecognition_continuous_Getter";

  @DomName('SpeechRecognition.continuous')
  @DocsEditable
  void set continuous(bool value) native "SpeechRecognition_continuous_Setter";

  @DomName('SpeechRecognition.grammars')
  @DocsEditable
  SpeechGrammarList get grammars native "SpeechRecognition_grammars_Getter";

  @DomName('SpeechRecognition.grammars')
  @DocsEditable
  void set grammars(SpeechGrammarList value) native "SpeechRecognition_grammars_Setter";

  @DomName('SpeechRecognition.interimResults')
  @DocsEditable
  bool get interimResults native "SpeechRecognition_interimResults_Getter";

  @DomName('SpeechRecognition.interimResults')
  @DocsEditable
  void set interimResults(bool value) native "SpeechRecognition_interimResults_Setter";

  @DomName('SpeechRecognition.lang')
  @DocsEditable
  String get lang native "SpeechRecognition_lang_Getter";

  @DomName('SpeechRecognition.lang')
  @DocsEditable
  void set lang(String value) native "SpeechRecognition_lang_Setter";

  @DomName('SpeechRecognition.maxAlternatives')
  @DocsEditable
  int get maxAlternatives native "SpeechRecognition_maxAlternatives_Getter";

  @DomName('SpeechRecognition.maxAlternatives')
  @DocsEditable
  void set maxAlternatives(int value) native "SpeechRecognition_maxAlternatives_Setter";

  @DomName('SpeechRecognition.abort')
  @DocsEditable
  void abort() native "SpeechRecognition_abort_Callback";

  @DomName('SpeechRecognition.addEventListener')
  @DocsEditable
  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "SpeechRecognition_addEventListener_Callback";

  @DomName('SpeechRecognition.dispatchEvent')
  @DocsEditable
  bool dispatchEvent(Event evt) native "SpeechRecognition_dispatchEvent_Callback";

  @DomName('SpeechRecognition.removeEventListener')
  @DocsEditable
  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "SpeechRecognition_removeEventListener_Callback";

  @DomName('SpeechRecognition.start')
  @DocsEditable
  void start() native "SpeechRecognition_start_Callback";

  @DomName('SpeechRecognition.stop')
  @DocsEditable
  void stop() native "SpeechRecognition_stop_Callback";

  @DomName('SpeechRecognition.onaudioend')
  @DocsEditable
  Stream<Event> get onAudioEnd => audioEndEvent.forTarget(this);

  @DomName('SpeechRecognition.onaudiostart')
  @DocsEditable
  Stream<Event> get onAudioStart => audioStartEvent.forTarget(this);

  @DomName('SpeechRecognition.onend')
  @DocsEditable
  Stream<Event> get onEnd => endEvent.forTarget(this);

  @DomName('SpeechRecognition.onerror')
  @DocsEditable
  Stream<SpeechRecognitionError> get onError => errorEvent.forTarget(this);

  @DomName('SpeechRecognition.onnomatch')
  @DocsEditable
  Stream<SpeechRecognitionEvent> get onNoMatch => noMatchEvent.forTarget(this);

  @DomName('SpeechRecognition.onresult')
  @DocsEditable
  Stream<SpeechRecognitionEvent> get onResult => resultEvent.forTarget(this);

  @DomName('SpeechRecognition.onsoundend')
  @DocsEditable
  Stream<Event> get onSoundEnd => soundEndEvent.forTarget(this);

  @DomName('SpeechRecognition.onsoundstart')
  @DocsEditable
  Stream<Event> get onSoundStart => soundStartEvent.forTarget(this);

  @DomName('SpeechRecognition.onspeechend')
  @DocsEditable
  Stream<Event> get onSpeechEnd => speechEndEvent.forTarget(this);

  @DomName('SpeechRecognition.onspeechstart')
  @DocsEditable
  Stream<Event> get onSpeechStart => speechStartEvent.forTarget(this);

  @DomName('SpeechRecognition.onstart')
  @DocsEditable
  Stream<Event> get onStart => startEvent.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.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('SpeechRecognitionAlternative')
@SupportedBrowser(SupportedBrowser.CHROME, '25')
@Experimental
class SpeechRecognitionAlternative extends NativeFieldWrapperClass1 {
  SpeechRecognitionAlternative.internal();

  @DomName('SpeechRecognitionAlternative.confidence')
  @DocsEditable
  num get confidence native "SpeechRecognitionAlternative_confidence_Getter";

  @DomName('SpeechRecognitionAlternative.transcript')
  @DocsEditable
  String get transcript native "SpeechRecognitionAlternative_transcript_Getter";

}
// 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.


@DocsEditable
@DomName('SpeechRecognitionError')
@SupportedBrowser(SupportedBrowser.CHROME, '25')
@Experimental
class SpeechRecognitionError extends Event {
  SpeechRecognitionError.internal() : super.internal();

  @DomName('SpeechRecognitionError.error')
  @DocsEditable
  String get error native "SpeechRecognitionError_error_Getter";

  @DomName('SpeechRecognitionError.message')
  @DocsEditable
  String get message native "SpeechRecognitionError_message_Getter";

}
// 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.


@DocsEditable
@DomName('SpeechRecognitionEvent')
@SupportedBrowser(SupportedBrowser.CHROME, '25')
@Experimental
class SpeechRecognitionEvent extends Event {
  SpeechRecognitionEvent.internal() : super.internal();

  @DomName('SpeechRecognitionEvent.result')
  @DocsEditable
  SpeechRecognitionResult get result native "SpeechRecognitionEvent_result_Getter";

  @DomName('SpeechRecognitionEvent.resultHistory')
  @DocsEditable
  List<SpeechRecognitionResult> get resultHistory native "SpeechRecognitionEvent_resultHistory_Getter";

  @DomName('SpeechRecognitionEvent.resultIndex')
  @DocsEditable
  int get resultIndex native "SpeechRecognitionEvent_resultIndex_Getter";

  @DomName('SpeechRecognitionEvent.results')
  @DocsEditable
  List<SpeechRecognitionResult> get results native "SpeechRecognitionEvent_results_Getter";

}
// 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.


@DocsEditable
@DomName('SpeechRecognitionResult')
@SupportedBrowser(SupportedBrowser.CHROME, '25')
@Experimental
class SpeechRecognitionResult extends NativeFieldWrapperClass1 {
  SpeechRecognitionResult.internal();

  @DomName('SpeechRecognitionResult.isFinal')
  @DocsEditable
  bool get isFinal native "SpeechRecognitionResult_isFinal_Getter";

  @DomName('SpeechRecognitionResult.length')
  @DocsEditable
  int get length native "SpeechRecognitionResult_length_Getter";

  @DomName('SpeechRecognitionResult.item')
  @DocsEditable
  SpeechRecognitionAlternative item(int index) native "SpeechRecognitionResult_item_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.


/**
 * The type used by the
 * [Window.localStorage] and [Window.sessionStorage] properties.
 * Storage is implemented as a Map&lt;String, String>.
 *
 * To store and get values, use Dart's built-in map syntax:
 *
 *     window.localStorage['key1'] = 'val1';
 *     window.localStorage['key2'] = 'val2';
 *     window.localStorage['key3'] = 'val3';
 *     assert(window.localStorage['key3'] == 'val3');
 *
 * You can use [Map](http://api.dartlang.org/dart_core/Map.html) APIs
 * such as containsValue(), clear(), and length:
 *
 *     assert(window.localStorage.containsValue('does not exist') == false);
 *     window.localStorage.clear();
 *     assert(window.localStorage.length == 0);
 *
 * For more examples of using this API, see
 * [localstorage_test.dart](http://code.google.com/p/dart/source/browse/branches/bleeding_edge/dart/tests/html/localstorage_test.dart).
 * For details on using the Map API, see the
 * [Maps](http://www.dartlang.org/docs/library-tour/#maps-aka-dictionaries-or-hashes)
 * section of the library tour.
 */
@DomName('Storage')
class Storage extends NativeFieldWrapperClass1 implements Map<String, String>
     {

  // TODO(nweiz): update this when maps support lazy iteration
  bool containsValue(String value) => values.any((e) => e == value);

  bool containsKey(String key) => $dom_getItem(key) != null;

  String operator [](String key) => $dom_getItem(key);

  void operator []=(String key, String value) { $dom_setItem(key, value); }

  String putIfAbsent(String key, String ifAbsent()) {
    if (!containsKey(key)) this[key] = ifAbsent();
    return this[key];
  }

  String remove(String key) {
    final value = this[key];
    $dom_removeItem(key);
    return value;
  }

  void clear() => $dom_clear();

  void forEach(void f(String key, String value)) {
    for (var i = 0; true; i++) {
      final key = $dom_key(i);
      if (key == null) return;

      f(key, this[key]);
    }
  }

  Collection<String> get keys {
    final keys = [];
    forEach((k, v) => keys.add(k));
    return keys;
  }

  Collection<String> get values {
    final values = [];
    forEach((k, v) => values.add(v));
    return values;
  }

  int get length => $dom_length;

  bool get isEmpty => $dom_key(0) == null;
  Storage.internal();

  @DomName('Storage.length')
  @DocsEditable
  int get $dom_length native "Storage_length_Getter";

  @DomName('Storage.clear')
  @DocsEditable
  void $dom_clear() native "Storage_clear_Callback";

  @DomName('Storage.getItem')
  @DocsEditable
  String $dom_getItem(String key) native "Storage_getItem_Callback";

  @DomName('Storage.key')
  @DocsEditable
  String $dom_key(int index) native "Storage_key_Callback";

  @DomName('Storage.removeItem')
  @DocsEditable
  void $dom_removeItem(String key) native "Storage_removeItem_Callback";

  @DomName('Storage.setItem')
  @DocsEditable
  void $dom_setItem(String key, String data) native "Storage_setItem_Callback";

}
// 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.


@DomName('StorageEvent')
class StorageEvent extends Event {
  factory StorageEvent(String type,
    {bool canBubble: false, bool cancelable: false, String key, String oldValue,
    String newValue, String url, Storage storageArea}) {

    var e = document.$dom_createEvent("StorageEvent");
    e.$dom_initStorageEvent(type, canBubble, cancelable, key, oldValue,
        newValue, url, storageArea);
    return e;
  }
  StorageEvent.internal() : super.internal();

  @DomName('StorageEvent.key')
  @DocsEditable
  String get key native "StorageEvent_key_Getter";

  @DomName('StorageEvent.newValue')
  @DocsEditable
  String get newValue native "StorageEvent_newValue_Getter";

  @DomName('StorageEvent.oldValue')
  @DocsEditable
  String get oldValue native "StorageEvent_oldValue_Getter";

  @DomName('StorageEvent.storageArea')
  @DocsEditable
  Storage get storageArea native "StorageEvent_storageArea_Getter";

  @DomName('StorageEvent.url')
  @DocsEditable
  String get url native "StorageEvent_url_Getter";

  @DomName('StorageEvent.initStorageEvent')
  @DocsEditable
  void $dom_initStorageEvent(String typeArg, bool canBubbleArg, bool cancelableArg, String keyArg, String oldValueArg, String newValueArg, String urlArg, Storage storageAreaArg) native "StorageEvent_initStorageEvent_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('StorageInfo')
class StorageInfo extends NativeFieldWrapperClass1 {
  StorageInfo.internal();

  static const int PERSISTENT = 1;

  static const int TEMPORARY = 0;

  @DomName('StorageInfo.queryUsageAndQuota')
  @DocsEditable
  void _queryUsageAndQuota(int storageType, [_StorageInfoUsageCallback usageCallback, _StorageInfoErrorCallback errorCallback]) native "StorageInfo_queryUsageAndQuota_Callback";

  Future<int> queryUsageAndQuota(int storageType) {
    var completer = new Completer<int>();
    _queryUsageAndQuota(storageType,
        (value) { completer.complete(value); },
        (error) { completer.completeError(error); });
    return completer.future;
  }

  @DomName('StorageInfo.requestQuota')
  @DocsEditable
  void _requestQuota(int storageType, int newQuotaInBytes, [StorageInfoQuotaCallback quotaCallback, _StorageInfoErrorCallback errorCallback]) native "StorageInfo_requestQuota_Callback";

  Future<int> requestQuota(int storageType, int newQuotaInBytes) {
    var completer = new Completer<int>();
    _requestQuota(storageType, newQuotaInBytes,
        (value) { completer.complete(value); },
        (error) { completer.completeError(error); });
    return completer.future;
  }

}
// 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.


typedef void _StorageInfoErrorCallback(DomException error);
// 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.


typedef void StorageInfoQuotaCallback(int grantedQuotaInBytes);
// 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.


typedef void _StorageInfoUsageCallback(int currentUsageInBytes, int currentQuotaInBytes);
// 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.


typedef void _StringCallback(String data);
// 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.


@DocsEditable
@DomName('HTMLStyleElement')
class StyleElement extends _Element_Merged {
  StyleElement.internal() : super.internal();

  @DomName('HTMLStyleElement.HTMLStyleElement')
  @DocsEditable
  factory StyleElement() => document.$dom_createElement("style");

  @DomName('HTMLStyleElement.disabled')
  @DocsEditable
  bool get disabled native "HTMLStyleElement_disabled_Getter";

  @DomName('HTMLStyleElement.disabled')
  @DocsEditable
  void set disabled(bool value) native "HTMLStyleElement_disabled_Setter";

  @DomName('HTMLStyleElement.media')
  @DocsEditable
  String get media native "HTMLStyleElement_media_Getter";

  @DomName('HTMLStyleElement.media')
  @DocsEditable
  void set media(String value) native "HTMLStyleElement_media_Setter";

  @DomName('HTMLStyleElement.scoped')
  @DocsEditable
  bool get scoped native "HTMLStyleElement_scoped_Getter";

  @DomName('HTMLStyleElement.scoped')
  @DocsEditable
  void set scoped(bool value) native "HTMLStyleElement_scoped_Setter";

  @DomName('HTMLStyleElement.sheet')
  @DocsEditable
  StyleSheet get sheet native "HTMLStyleElement_sheet_Getter";

  @DomName('HTMLStyleElement.type')
  @DocsEditable
  String get type native "HTMLStyleElement_type_Getter";

  @DomName('HTMLStyleElement.type')
  @DocsEditable
  void set type(String value) native "HTMLStyleElement_type_Setter";

}
// 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.


@DocsEditable
@DomName('StyleMedia')
class StyleMedia extends NativeFieldWrapperClass1 {
  StyleMedia.internal();

  @DomName('StyleMedia.type')
  @DocsEditable
  String get type native "StyleMedia_type_Getter";

  @DomName('StyleMedia.matchMedium')
  @DocsEditable
  bool matchMedium(String mediaquery) native "StyleMedia_matchMedium_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('StyleSheet')
class StyleSheet extends NativeFieldWrapperClass1 {
  StyleSheet.internal();

  @DomName('StyleSheet.disabled')
  @DocsEditable
  bool get disabled native "StyleSheet_disabled_Getter";

  @DomName('StyleSheet.disabled')
  @DocsEditable
  void set disabled(bool value) native "StyleSheet_disabled_Setter";

  @DomName('StyleSheet.href')
  @DocsEditable
  String get href native "StyleSheet_href_Getter";

  @DomName('StyleSheet.media')
  @DocsEditable
  MediaList get media native "StyleSheet_media_Getter";

  @DomName('StyleSheet.ownerNode')
  @DocsEditable
  Node get ownerNode native "StyleSheet_ownerNode_Getter";

  @DomName('StyleSheet.parentStyleSheet')
  @DocsEditable
  StyleSheet get parentStyleSheet native "StyleSheet_parentStyleSheet_Getter";

  @DomName('StyleSheet.title')
  @DocsEditable
  String get title native "StyleSheet_title_Getter";

  @DomName('StyleSheet.type')
  @DocsEditable
  String get type native "StyleSheet_type_Getter";

}
// 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.


@DocsEditable
@DomName('HTMLTableCaptionElement')
class TableCaptionElement extends _Element_Merged {
  TableCaptionElement.internal() : super.internal();

  @DomName('HTMLTableCaptionElement.HTMLTableCaptionElement')
  @DocsEditable
  factory TableCaptionElement() => document.$dom_createElement("caption");

}
// 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.


@DocsEditable
@DomName('HTMLTableCellElement')
class TableCellElement extends _Element_Merged {
  TableCellElement.internal() : super.internal();

  @DomName('HTMLTableCellElement.HTMLTableCellElement')
  @DocsEditable
  factory TableCellElement() => document.$dom_createElement("td");

  @DomName('HTMLTableCellElement.cellIndex')
  @DocsEditable
  int get cellIndex native "HTMLTableCellElement_cellIndex_Getter";

  @DomName('HTMLTableCellElement.colSpan')
  @DocsEditable
  int get colSpan native "HTMLTableCellElement_colSpan_Getter";

  @DomName('HTMLTableCellElement.colSpan')
  @DocsEditable
  void set colSpan(int value) native "HTMLTableCellElement_colSpan_Setter";

  @DomName('HTMLTableCellElement.headers')
  @DocsEditable
  String get headers native "HTMLTableCellElement_headers_Getter";

  @DomName('HTMLTableCellElement.headers')
  @DocsEditable
  void set headers(String value) native "HTMLTableCellElement_headers_Setter";

  @DomName('HTMLTableCellElement.rowSpan')
  @DocsEditable
  int get rowSpan native "HTMLTableCellElement_rowSpan_Getter";

  @DomName('HTMLTableCellElement.rowSpan')
  @DocsEditable
  void set rowSpan(int value) native "HTMLTableCellElement_rowSpan_Setter";

}
// 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.


@DocsEditable
@DomName('HTMLTableColElement')
class TableColElement extends _Element_Merged {
  TableColElement.internal() : super.internal();

  @DomName('HTMLTableColElement.HTMLTableColElement')
  @DocsEditable
  factory TableColElement() => document.$dom_createElement("col");

  @DomName('HTMLTableColElement.span')
  @DocsEditable
  int get span native "HTMLTableColElement_span_Getter";

  @DomName('HTMLTableColElement.span')
  @DocsEditable
  void set span(int value) native "HTMLTableColElement_span_Setter";

}
// 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('HTMLTableElement')
class TableElement extends _Element_Merged {

  @DomName('HTMLTableElement.tBodies')
  List<TableSectionElement> get tBodies =>
  new _WrappedList<TableSectionElement>($dom_tBodies);

  @DomName('HTMLTableElement.rows')
  List<TableRowElement> get rows =>
      new _WrappedList<TableRowElement>($dom_rows);

  TableRowElement addRow() {
    return insertRow(-1);
  }

  TableCaptionElement createCaption() => $dom_createCaption();
  TableSectionElement createTBody() => $dom_createTBody();
  TableSectionElement createTFoot() => $dom_createTFoot();
  TableSectionElement createTHead() => $dom_createTHead();
  TableRowElement insertRow(int index) => $dom_insertRow(index);


  TableElement.internal() : super.internal();

  @DomName('HTMLTableElement.HTMLTableElement')
  @DocsEditable
  factory TableElement() => document.$dom_createElement("table");

  @DomName('HTMLTableElement.border')
  @DocsEditable
  String get border native "HTMLTableElement_border_Getter";

  @DomName('HTMLTableElement.border')
  @DocsEditable
  void set border(String value) native "HTMLTableElement_border_Setter";

  @DomName('HTMLTableElement.caption')
  @DocsEditable
  TableCaptionElement get caption native "HTMLTableElement_caption_Getter";

  @DomName('HTMLTableElement.caption')
  @DocsEditable
  void set caption(TableCaptionElement value) native "HTMLTableElement_caption_Setter";

  @DomName('HTMLTableElement.rows')
  @DocsEditable
  HtmlCollection get $dom_rows native "HTMLTableElement_rows_Getter";

  @DomName('HTMLTableElement.tBodies')
  @DocsEditable
  HtmlCollection get $dom_tBodies native "HTMLTableElement_tBodies_Getter";

  @DomName('HTMLTableElement.tFoot')
  @DocsEditable
  TableSectionElement get tFoot native "HTMLTableElement_tFoot_Getter";

  @DomName('HTMLTableElement.tFoot')
  @DocsEditable
  void set tFoot(TableSectionElement value) native "HTMLTableElement_tFoot_Setter";

  @DomName('HTMLTableElement.tHead')
  @DocsEditable
  TableSectionElement get tHead native "HTMLTableElement_tHead_Getter";

  @DomName('HTMLTableElement.tHead')
  @DocsEditable
  void set tHead(TableSectionElement value) native "HTMLTableElement_tHead_Setter";

  @DomName('HTMLTableElement.createCaption')
  @DocsEditable
  Element $dom_createCaption() native "HTMLTableElement_createCaption_Callback";

  @DomName('HTMLTableElement.createTBody')
  @DocsEditable
  Element $dom_createTBody() native "HTMLTableElement_createTBody_Callback";

  @DomName('HTMLTableElement.createTFoot')
  @DocsEditable
  Element $dom_createTFoot() native "HTMLTableElement_createTFoot_Callback";

  @DomName('HTMLTableElement.createTHead')
  @DocsEditable
  Element $dom_createTHead() native "HTMLTableElement_createTHead_Callback";

  @DomName('HTMLTableElement.deleteCaption')
  @DocsEditable
  void deleteCaption() native "HTMLTableElement_deleteCaption_Callback";

  @DomName('HTMLTableElement.deleteRow')
  @DocsEditable
  void deleteRow(int index) native "HTMLTableElement_deleteRow_Callback";

  @DomName('HTMLTableElement.deleteTFoot')
  @DocsEditable
  void deleteTFoot() native "HTMLTableElement_deleteTFoot_Callback";

  @DomName('HTMLTableElement.deleteTHead')
  @DocsEditable
  void deleteTHead() native "HTMLTableElement_deleteTHead_Callback";

  @DomName('HTMLTableElement.insertRow')
  @DocsEditable
  Element $dom_insertRow(int index) native "HTMLTableElement_insertRow_Callback";
}
// 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('HTMLTableRowElement')
class TableRowElement extends _Element_Merged {

  @DomName('HTMLTableRowElement.cells')
  List<TableCellElement> get cells =>
      new _WrappedList<TableCellElement>($dom_cells);

  TableCellElement addCell() {
    return insertCell(-1);
  }

  TableCellElement insertCell(int index) => $dom_insertCell(index);

  TableRowElement.internal() : super.internal();

  @DomName('HTMLTableRowElement.HTMLTableRowElement')
  @DocsEditable
  factory TableRowElement() => document.$dom_createElement("tr");

  @DomName('HTMLTableRowElement.cells')
  @DocsEditable
  HtmlCollection get $dom_cells native "HTMLTableRowElement_cells_Getter";

  @DomName('HTMLTableRowElement.rowIndex')
  @DocsEditable
  int get rowIndex native "HTMLTableRowElement_rowIndex_Getter";

  @DomName('HTMLTableRowElement.sectionRowIndex')
  @DocsEditable
  int get sectionRowIndex native "HTMLTableRowElement_sectionRowIndex_Getter";

  @DomName('HTMLTableRowElement.deleteCell')
  @DocsEditable
  void deleteCell(int index) native "HTMLTableRowElement_deleteCell_Callback";

  @DomName('HTMLTableRowElement.insertCell')
  @DocsEditable
  Element $dom_insertCell(int index) native "HTMLTableRowElement_insertCell_Callback";
}
// 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('HTMLTableSectionElement')
class TableSectionElement extends _Element_Merged {

  @DomName('HTMLTableSectionElement.rows')
  List<TableRowElement> get rows =>
    new _WrappedList<TableRowElement>($dom_rows);

  TableRowElement addRow() {
    return insertRow(-1);
  }

  TableRowElement insertRow(int index) => $dom_insertRow(index);

  TableSectionElement.internal() : super.internal();

  @DomName('HTMLTableSectionElement.rows')
  @DocsEditable
  HtmlCollection get $dom_rows native "HTMLTableSectionElement_rows_Getter";

  @DomName('HTMLTableSectionElement.deleteRow')
  @DocsEditable
  void deleteRow(int index) native "HTMLTableSectionElement_deleteRow_Callback";

  @DomName('HTMLTableSectionElement.insertRow')
  @DocsEditable
  Element $dom_insertRow(int index) native "HTMLTableSectionElement_insertRow_Callback";
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DomName('Text')
class Text extends CharacterData {
  factory Text(String data) => _TextFactoryProvider.createText(data);
  Text.internal() : super.internal();

  @DomName('Text.wholeText')
  @DocsEditable
  String get wholeText native "Text_wholeText_Getter";

  @DomName('Text.replaceWholeText')
  @DocsEditable
  Text replaceWholeText(String content) native "Text_replaceWholeText_Callback";

  @DomName('Text.splitText')
  @DocsEditable
  Text splitText(int offset) native "Text_splitText_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('HTMLTextAreaElement')
class TextAreaElement extends _Element_Merged {
  TextAreaElement.internal() : super.internal();

  @DomName('HTMLTextAreaElement.HTMLTextAreaElement')
  @DocsEditable
  factory TextAreaElement() => document.$dom_createElement("textarea");

  @DomName('HTMLTextAreaElement.autofocus')
  @DocsEditable
  bool get autofocus native "HTMLTextAreaElement_autofocus_Getter";

  @DomName('HTMLTextAreaElement.autofocus')
  @DocsEditable
  void set autofocus(bool value) native "HTMLTextAreaElement_autofocus_Setter";

  @DomName('HTMLTextAreaElement.cols')
  @DocsEditable
  int get cols native "HTMLTextAreaElement_cols_Getter";

  @DomName('HTMLTextAreaElement.cols')
  @DocsEditable
  void set cols(int value) native "HTMLTextAreaElement_cols_Setter";

  @DomName('HTMLTextAreaElement.defaultValue')
  @DocsEditable
  String get defaultValue native "HTMLTextAreaElement_defaultValue_Getter";

  @DomName('HTMLTextAreaElement.defaultValue')
  @DocsEditable
  void set defaultValue(String value) native "HTMLTextAreaElement_defaultValue_Setter";

  @DomName('HTMLTextAreaElement.dirName')
  @DocsEditable
  String get dirName native "HTMLTextAreaElement_dirName_Getter";

  @DomName('HTMLTextAreaElement.dirName')
  @DocsEditable
  void set dirName(String value) native "HTMLTextAreaElement_dirName_Setter";

  @DomName('HTMLTextAreaElement.disabled')
  @DocsEditable
  bool get disabled native "HTMLTextAreaElement_disabled_Getter";

  @DomName('HTMLTextAreaElement.disabled')
  @DocsEditable
  void set disabled(bool value) native "HTMLTextAreaElement_disabled_Setter";

  @DomName('HTMLTextAreaElement.form')
  @DocsEditable
  FormElement get form native "HTMLTextAreaElement_form_Getter";

  @DomName('HTMLTextAreaElement.labels')
  @DocsEditable
  List<Node> get labels native "HTMLTextAreaElement_labels_Getter";

  @DomName('HTMLTextAreaElement.maxLength')
  @DocsEditable
  int get maxLength native "HTMLTextAreaElement_maxLength_Getter";

  @DomName('HTMLTextAreaElement.maxLength')
  @DocsEditable
  void set maxLength(int value) native "HTMLTextAreaElement_maxLength_Setter";

  @DomName('HTMLTextAreaElement.name')
  @DocsEditable
  String get name native "HTMLTextAreaElement_name_Getter";

  @DomName('HTMLTextAreaElement.name')
  @DocsEditable
  void set name(String value) native "HTMLTextAreaElement_name_Setter";

  @DomName('HTMLTextAreaElement.placeholder')
  @DocsEditable
  String get placeholder native "HTMLTextAreaElement_placeholder_Getter";

  @DomName('HTMLTextAreaElement.placeholder')
  @DocsEditable
  void set placeholder(String value) native "HTMLTextAreaElement_placeholder_Setter";

  @DomName('HTMLTextAreaElement.readOnly')
  @DocsEditable
  bool get readOnly native "HTMLTextAreaElement_readOnly_Getter";

  @DomName('HTMLTextAreaElement.readOnly')
  @DocsEditable
  void set readOnly(bool value) native "HTMLTextAreaElement_readOnly_Setter";

  @DomName('HTMLTextAreaElement.required')
  @DocsEditable
  bool get required native "HTMLTextAreaElement_required_Getter";

  @DomName('HTMLTextAreaElement.required')
  @DocsEditable
  void set required(bool value) native "HTMLTextAreaElement_required_Setter";

  @DomName('HTMLTextAreaElement.rows')
  @DocsEditable
  int get rows native "HTMLTextAreaElement_rows_Getter";

  @DomName('HTMLTextAreaElement.rows')
  @DocsEditable
  void set rows(int value) native "HTMLTextAreaElement_rows_Setter";

  @DomName('HTMLTextAreaElement.selectionDirection')
  @DocsEditable
  String get selectionDirection native "HTMLTextAreaElement_selectionDirection_Getter";

  @DomName('HTMLTextAreaElement.selectionDirection')
  @DocsEditable
  void set selectionDirection(String value) native "HTMLTextAreaElement_selectionDirection_Setter";

  @DomName('HTMLTextAreaElement.selectionEnd')
  @DocsEditable
  int get selectionEnd native "HTMLTextAreaElement_selectionEnd_Getter";

  @DomName('HTMLTextAreaElement.selectionEnd')
  @DocsEditable
  void set selectionEnd(int value) native "HTMLTextAreaElement_selectionEnd_Setter";

  @DomName('HTMLTextAreaElement.selectionStart')
  @DocsEditable
  int get selectionStart native "HTMLTextAreaElement_selectionStart_Getter";

  @DomName('HTMLTextAreaElement.selectionStart')
  @DocsEditable
  void set selectionStart(int value) native "HTMLTextAreaElement_selectionStart_Setter";

  @DomName('HTMLTextAreaElement.textLength')
  @DocsEditable
  int get textLength native "HTMLTextAreaElement_textLength_Getter";

  @DomName('HTMLTextAreaElement.type')
  @DocsEditable
  String get type native "HTMLTextAreaElement_type_Getter";

  @DomName('HTMLTextAreaElement.validationMessage')
  @DocsEditable
  String get validationMessage native "HTMLTextAreaElement_validationMessage_Getter";

  @DomName('HTMLTextAreaElement.validity')
  @DocsEditable
  ValidityState get validity native "HTMLTextAreaElement_validity_Getter";

  @DomName('HTMLTextAreaElement.value')
  @DocsEditable
  String get value native "HTMLTextAreaElement_value_Getter";

  @DomName('HTMLTextAreaElement.value')
  @DocsEditable
  void set value(String value) native "HTMLTextAreaElement_value_Setter";

  @DomName('HTMLTextAreaElement.willValidate')
  @DocsEditable
  bool get willValidate native "HTMLTextAreaElement_willValidate_Getter";

  @DomName('HTMLTextAreaElement.wrap')
  @DocsEditable
  String get wrap native "HTMLTextAreaElement_wrap_Getter";

  @DomName('HTMLTextAreaElement.wrap')
  @DocsEditable
  void set wrap(String value) native "HTMLTextAreaElement_wrap_Setter";

  @DomName('HTMLTextAreaElement.checkValidity')
  @DocsEditable
  bool checkValidity() native "HTMLTextAreaElement_checkValidity_Callback";

  @DomName('HTMLTextAreaElement.select')
  @DocsEditable
  void select() native "HTMLTextAreaElement_select_Callback";

  @DomName('HTMLTextAreaElement.setCustomValidity')
  @DocsEditable
  void setCustomValidity(String error) native "HTMLTextAreaElement_setCustomValidity_Callback";

  void setRangeText(String replacement, [int start, int end, String selectionMode]) {
    if ((replacement is String || replacement == null) && !?start && !?end && !?selectionMode) {
      _setRangeText_1(replacement);
      return;
    }
    if ((replacement is String || replacement == null) && (start is int || start == null) && (end is int || end == null) && (selectionMode is String || selectionMode == null)) {
      _setRangeText_2(replacement, start, end, selectionMode);
      return;
    }
    throw new ArgumentError("Incorrect number or type of arguments");
  }

  @DomName('HTMLTextAreaElement._setRangeText_1')
  @DocsEditable
  void _setRangeText_1(replacement) native "HTMLTextAreaElement__setRangeText_1_Callback";

  @DomName('HTMLTextAreaElement._setRangeText_2')
  @DocsEditable
  void _setRangeText_2(replacement, start, end, selectionMode) native "HTMLTextAreaElement__setRangeText_2_Callback";

  void setSelectionRange(int start, int end, [String direction]) {
    if (?direction) {
      _setSelectionRange_1(start, end, direction);
      return;
    }
    _setSelectionRange_2(start, end);
    return;
  }

  @DomName('HTMLTextAreaElement._setSelectionRange_1')
  @DocsEditable
  void _setSelectionRange_1(start, end, direction) native "HTMLTextAreaElement__setSelectionRange_1_Callback";

  @DomName('HTMLTextAreaElement._setSelectionRange_2')
  @DocsEditable
  void _setSelectionRange_2(start, end) native "HTMLTextAreaElement__setSelectionRange_2_Callback";

}
// 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.


@DomName('TextEvent')
class TextEvent extends UIEvent {
  factory TextEvent(String type,
    {bool canBubble: false, bool cancelable: false, Window view, String data}) {
    if (view == null) {
      view = window;
    }
    var e = document.$dom_createEvent("TextEvent");
    e.$dom_initTextEvent(type, canBubble, cancelable, view, data);
    return e;
  }
  TextEvent.internal() : super.internal();

  @DomName('TextEvent.data')
  @DocsEditable
  String get data native "TextEvent_data_Getter";

  @DomName('TextEvent.initTextEvent')
  @DocsEditable
  void $dom_initTextEvent(String typeArg, bool canBubbleArg, bool cancelableArg, Window viewArg, String dataArg) native "TextEvent_initTextEvent_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('TextMetrics')
class TextMetrics extends NativeFieldWrapperClass1 {
  TextMetrics.internal();

  @DomName('TextMetrics.width')
  @DocsEditable
  num get width native "TextMetrics_width_Getter";

}
// 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.


@DocsEditable
@DomName('TextTrack')
class TextTrack extends EventTarget {
  TextTrack.internal() : super.internal();

  @DomName('TextTrack.cuechangeEvent')
  @DocsEditable
  static const EventStreamProvider<Event> cueChangeEvent = const EventStreamProvider<Event>('cuechange');

  @DomName('TextTrack.activeCues')
  @DocsEditable
  TextTrackCueList get activeCues native "TextTrack_activeCues_Getter";

  @DomName('TextTrack.cues')
  @DocsEditable
  TextTrackCueList get cues native "TextTrack_cues_Getter";

  @DomName('TextTrack.kind')
  @DocsEditable
  String get kind native "TextTrack_kind_Getter";

  @DomName('TextTrack.label')
  @DocsEditable
  String get label native "TextTrack_label_Getter";

  @DomName('TextTrack.language')
  @DocsEditable
  String get language native "TextTrack_language_Getter";

  @DomName('TextTrack.mode')
  @DocsEditable
  String get mode native "TextTrack_mode_Getter";

  @DomName('TextTrack.mode')
  @DocsEditable
  void set mode(String value) native "TextTrack_mode_Setter";

  @DomName('TextTrack.addCue')
  @DocsEditable
  void addCue(TextTrackCue cue) native "TextTrack_addCue_Callback";

  @DomName('TextTrack.addEventListener')
  @DocsEditable
  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "TextTrack_addEventListener_Callback";

  @DomName('TextTrack.dispatchEvent')
  @DocsEditable
  bool dispatchEvent(Event evt) native "TextTrack_dispatchEvent_Callback";

  @DomName('TextTrack.removeCue')
  @DocsEditable
  void removeCue(TextTrackCue cue) native "TextTrack_removeCue_Callback";

  @DomName('TextTrack.removeEventListener')
  @DocsEditable
  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "TextTrack_removeEventListener_Callback";

  @DomName('TextTrack.oncuechange')
  @DocsEditable
  Stream<Event> get onCueChange => cueChangeEvent.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.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('TextTrackCue')
class TextTrackCue extends EventTarget {
  TextTrackCue.internal() : super.internal();

  @DomName('TextTrackCue.enterEvent')
  @DocsEditable
  static const EventStreamProvider<Event> enterEvent = const EventStreamProvider<Event>('enter');

  @DomName('TextTrackCue.exitEvent')
  @DocsEditable
  static const EventStreamProvider<Event> exitEvent = const EventStreamProvider<Event>('exit');

  @DomName('TextTrackCue.TextTrackCue')
  @DocsEditable
  factory TextTrackCue(num startTime, num endTime, String text) {
    return TextTrackCue._create_1(startTime, endTime, text);
  }

  @DocsEditable
  static TextTrackCue _create_1(startTime, endTime, text) native "TextTrackCue__create_1constructorCallback";

  @DomName('TextTrackCue.align')
  @DocsEditable
  String get align native "TextTrackCue_align_Getter";

  @DomName('TextTrackCue.align')
  @DocsEditable
  void set align(String value) native "TextTrackCue_align_Setter";

  @DomName('TextTrackCue.endTime')
  @DocsEditable
  num get endTime native "TextTrackCue_endTime_Getter";

  @DomName('TextTrackCue.endTime')
  @DocsEditable
  void set endTime(num value) native "TextTrackCue_endTime_Setter";

  @DomName('TextTrackCue.id')
  @DocsEditable
  String get id native "TextTrackCue_id_Getter";

  @DomName('TextTrackCue.id')
  @DocsEditable
  void set id(String value) native "TextTrackCue_id_Setter";

  @DomName('TextTrackCue.line')
  @DocsEditable
  int get line native "TextTrackCue_line_Getter";

  @DomName('TextTrackCue.line')
  @DocsEditable
  void set line(int value) native "TextTrackCue_line_Setter";

  @DomName('TextTrackCue.pauseOnExit')
  @DocsEditable
  bool get pauseOnExit native "TextTrackCue_pauseOnExit_Getter";

  @DomName('TextTrackCue.pauseOnExit')
  @DocsEditable
  void set pauseOnExit(bool value) native "TextTrackCue_pauseOnExit_Setter";

  @DomName('TextTrackCue.position')
  @DocsEditable
  int get position native "TextTrackCue_position_Getter";

  @DomName('TextTrackCue.position')
  @DocsEditable
  void set position(int value) native "TextTrackCue_position_Setter";

  @DomName('TextTrackCue.size')
  @DocsEditable
  int get size native "TextTrackCue_size_Getter";

  @DomName('TextTrackCue.size')
  @DocsEditable
  void set size(int value) native "TextTrackCue_size_Setter";

  @DomName('TextTrackCue.snapToLines')
  @DocsEditable
  bool get snapToLines native "TextTrackCue_snapToLines_Getter";

  @DomName('TextTrackCue.snapToLines')
  @DocsEditable
  void set snapToLines(bool value) native "TextTrackCue_snapToLines_Setter";

  @DomName('TextTrackCue.startTime')
  @DocsEditable
  num get startTime native "TextTrackCue_startTime_Getter";

  @DomName('TextTrackCue.startTime')
  @DocsEditable
  void set startTime(num value) native "TextTrackCue_startTime_Setter";

  @DomName('TextTrackCue.text')
  @DocsEditable
  String get text native "TextTrackCue_text_Getter";

  @DomName('TextTrackCue.text')
  @DocsEditable
  void set text(String value) native "TextTrackCue_text_Setter";

  @DomName('TextTrackCue.track')
  @DocsEditable
  TextTrack get track native "TextTrackCue_track_Getter";

  @DomName('TextTrackCue.vertical')
  @DocsEditable
  String get vertical native "TextTrackCue_vertical_Getter";

  @DomName('TextTrackCue.vertical')
  @DocsEditable
  void set vertical(String value) native "TextTrackCue_vertical_Setter";

  @DomName('TextTrackCue.addEventListener')
  @DocsEditable
  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "TextTrackCue_addEventListener_Callback";

  @DomName('TextTrackCue.dispatchEvent')
  @DocsEditable
  bool dispatchEvent(Event evt) native "TextTrackCue_dispatchEvent_Callback";

  @DomName('TextTrackCue.getCueAsHTML')
  @DocsEditable
  DocumentFragment getCueAsHtml() native "TextTrackCue_getCueAsHTML_Callback";

  @DomName('TextTrackCue.removeEventListener')
  @DocsEditable
  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "TextTrackCue_removeEventListener_Callback";

  @DomName('TextTrackCue.onenter')
  @DocsEditable
  Stream<Event> get onEnter => enterEvent.forTarget(this);

  @DomName('TextTrackCue.onexit')
  @DocsEditable
  Stream<Event> get onExit => exitEvent.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.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('TextTrackCueList')
class TextTrackCueList extends NativeFieldWrapperClass1 implements List<TextTrackCue> {
  TextTrackCueList.internal();

  @DomName('TextTrackCueList.length')
  @DocsEditable
  int get length native "TextTrackCueList_length_Getter";

  TextTrackCue operator[](int index) native "TextTrackCueList_item_Callback";

  void operator[]=(int index, TextTrackCue value) {
    throw new UnsupportedError("Cannot assign element of immutable List.");
  }
  // -- start List<TextTrackCue> mixins.
  // TextTrackCue is the element type.

  // From Iterable<TextTrackCue>:

  Iterator<TextTrackCue> 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<TextTrackCue>(this);
  }

  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, TextTrackCue)) {
    return IterableMixinWorkaround.reduce(this, initialValue, combine);
  }

  bool contains(TextTrackCue element) => IterableMixinWorkaround.contains(this, element);

  void forEach(void f(TextTrackCue element)) => IterableMixinWorkaround.forEach(this, f);

  String join([String separator]) =>
      IterableMixinWorkaround.joinList(this, separator);

  Iterable map(f(TextTrackCue element)) =>
      IterableMixinWorkaround.mapList(this, f);

  Iterable<TextTrackCue> where(bool f(TextTrackCue element)) =>
      IterableMixinWorkaround.where(this, f);

  Iterable expand(Iterable f(TextTrackCue element)) =>
      IterableMixinWorkaround.expand(this, f);

  bool every(bool f(TextTrackCue element)) => IterableMixinWorkaround.every(this, f);

  bool any(bool f(TextTrackCue element)) => IterableMixinWorkaround.any(this, f);

  List<TextTrackCue> toList({ bool growable: true }) =>
      new List<TextTrackCue>.from(this, growable: growable);

  Set<TextTrackCue> toSet() => new Set<TextTrackCue>.from(this);

  bool get isEmpty => this.length == 0;

  Iterable<TextTrackCue> take(int n) => IterableMixinWorkaround.takeList(this, n);

  Iterable<TextTrackCue> takeWhile(bool test(TextTrackCue value)) {
    return IterableMixinWorkaround.takeWhile(this, test);
  }

  Iterable<TextTrackCue> skip(int n) => IterableMixinWorkaround.skipList(this, n);

  Iterable<TextTrackCue> skipWhile(bool test(TextTrackCue value)) {
    return IterableMixinWorkaround.skipWhile(this, test);
  }

  TextTrackCue firstWhere(bool test(TextTrackCue value), { TextTrackCue orElse() }) {
    return IterableMixinWorkaround.firstWhere(this, test, orElse);
  }

  TextTrackCue lastWhere(bool test(TextTrackCue value), {TextTrackCue orElse()}) {
    return IterableMixinWorkaround.lastWhereList(this, test, orElse);
  }

  TextTrackCue singleWhere(bool test(TextTrackCue value)) {
    return IterableMixinWorkaround.singleWhere(this, test);
  }

  TextTrackCue elementAt(int index) {
    return this[index];
  }

  // From Collection<TextTrackCue>:

  void add(TextTrackCue value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(TextTrackCue value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Iterable<TextTrackCue> iterable) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  // From List<TextTrackCue>:
  void set length(int value) {
    throw new UnsupportedError("Cannot resize immutable List.");
  }

  void clear() {
    throw new UnsupportedError("Cannot clear immutable List.");
  }

  Iterable<TextTrackCue> get reversed {
    return IterableMixinWorkaround.reversedList(this);
  }

  void sort([int compare(TextTrackCue a, TextTrackCue b)]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(TextTrackCue element, [int start = 0]) =>
      Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(TextTrackCue element, [int start]) {
    if (start == null) start = length - 1;
    return Lists.lastIndexOf(this, element, start);
  }

  TextTrackCue get first {
    if (this.length > 0) return this[0];
    throw new StateError("No elements");
  }

  TextTrackCue get last {
    if (this.length > 0) return this[this.length - 1];
    throw new StateError("No elements");
  }

  TextTrackCue get single {
    if (length == 1) return this[0];
    if (length == 0) throw new StateError("No elements");
    throw new StateError("More than one element");
  }

  TextTrackCue min([int compare(TextTrackCue a, TextTrackCue b)]) =>
      IterableMixinWorkaround.min(this, compare);

  TextTrackCue max([int compare(TextTrackCue a, TextTrackCue b)]) =>
      IterableMixinWorkaround.max(this, compare);

  void insert(int index, TextTrackCue element) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  TextTrackCue removeAt(int pos) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  TextTrackCue removeLast() {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void remove(Object object) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void removeAll(Iterable elements) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void retainAll(Iterable elements) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void removeWhere(bool test(TextTrackCue element)) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void retainWhere(bool test(TextTrackCue element)) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void setRange(int start, int rangeLength, List<TextTrackCue> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [TextTrackCue initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<TextTrackCue> sublist(int start, [int end]) {
    if (end == null) end = length;
    return Lists.getRange(this, start, end, <TextTrackCue>[]);
  }

  List<TextTrackCue> getRange(int start, int rangeLength) =>
      sublist(start, start + rangeLength);

  Map<int, TextTrackCue> asMap() =>
    IterableMixinWorkaround.asMapList(this);

  // -- end List<TextTrackCue> mixins.

  @DomName('TextTrackCueList.getCueById')
  @DocsEditable
  TextTrackCue getCueById(String id) native "TextTrackCueList_getCueById_Callback";

  @DomName('TextTrackCueList.item')
  @DocsEditable
  TextTrackCue item(int index) native "TextTrackCueList_item_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('TextTrackList')
class TextTrackList extends EventTarget implements List<TextTrack> {
  TextTrackList.internal() : super.internal();

  @DomName('TextTrackList.addtrackEvent')
  @DocsEditable
  static const EventStreamProvider<TrackEvent> addTrackEvent = const EventStreamProvider<TrackEvent>('addtrack');

  @DomName('TextTrackList.length')
  @DocsEditable
  int get length native "TextTrackList_length_Getter";

  TextTrack operator[](int index) native "TextTrackList_item_Callback";

  void operator[]=(int index, TextTrack value) {
    throw new UnsupportedError("Cannot assign element of immutable List.");
  }
  // -- start List<TextTrack> mixins.
  // TextTrack is the element type.

  // From Iterable<TextTrack>:

  Iterator<TextTrack> 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<TextTrack>(this);
  }

  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, TextTrack)) {
    return IterableMixinWorkaround.reduce(this, initialValue, combine);
  }

  bool contains(TextTrack element) => IterableMixinWorkaround.contains(this, element);

  void forEach(void f(TextTrack element)) => IterableMixinWorkaround.forEach(this, f);

  String join([String separator]) =>
      IterableMixinWorkaround.joinList(this, separator);

  Iterable map(f(TextTrack element)) =>
      IterableMixinWorkaround.mapList(this, f);

  Iterable<TextTrack> where(bool f(TextTrack element)) =>
      IterableMixinWorkaround.where(this, f);

  Iterable expand(Iterable f(TextTrack element)) =>
      IterableMixinWorkaround.expand(this, f);

  bool every(bool f(TextTrack element)) => IterableMixinWorkaround.every(this, f);

  bool any(bool f(TextTrack element)) => IterableMixinWorkaround.any(this, f);

  List<TextTrack> toList({ bool growable: true }) =>
      new List<TextTrack>.from(this, growable: growable);

  Set<TextTrack> toSet() => new Set<TextTrack>.from(this);

  bool get isEmpty => this.length == 0;

  Iterable<TextTrack> take(int n) => IterableMixinWorkaround.takeList(this, n);

  Iterable<TextTrack> takeWhile(bool test(TextTrack value)) {
    return IterableMixinWorkaround.takeWhile(this, test);
  }

  Iterable<TextTrack> skip(int n) => IterableMixinWorkaround.skipList(this, n);

  Iterable<TextTrack> skipWhile(bool test(TextTrack value)) {
    return IterableMixinWorkaround.skipWhile(this, test);
  }

  TextTrack firstWhere(bool test(TextTrack value), { TextTrack orElse() }) {
    return IterableMixinWorkaround.firstWhere(this, test, orElse);
  }

  TextTrack lastWhere(bool test(TextTrack value), {TextTrack orElse()}) {
    return IterableMixinWorkaround.lastWhereList(this, test, orElse);
  }

  TextTrack singleWhere(bool test(TextTrack value)) {
    return IterableMixinWorkaround.singleWhere(this, test);
  }

  TextTrack elementAt(int index) {
    return this[index];
  }

  // From Collection<TextTrack>:

  void add(TextTrack value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(TextTrack value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Iterable<TextTrack> iterable) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  // From List<TextTrack>:
  void set length(int value) {
    throw new UnsupportedError("Cannot resize immutable List.");
  }

  void clear() {
    throw new UnsupportedError("Cannot clear immutable List.");
  }

  Iterable<TextTrack> get reversed {
    return IterableMixinWorkaround.reversedList(this);
  }

  void sort([int compare(TextTrack a, TextTrack b)]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(TextTrack element, [int start = 0]) =>
      Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(TextTrack element, [int start]) {
    if (start == null) start = length - 1;
    return Lists.lastIndexOf(this, element, start);
  }

  TextTrack get first {
    if (this.length > 0) return this[0];
    throw new StateError("No elements");
  }

  TextTrack get last {
    if (this.length > 0) return this[this.length - 1];
    throw new StateError("No elements");
  }

  TextTrack get single {
    if (length == 1) return this[0];
    if (length == 0) throw new StateError("No elements");
    throw new StateError("More than one element");
  }

  TextTrack min([int compare(TextTrack a, TextTrack b)]) =>
      IterableMixinWorkaround.min(this, compare);

  TextTrack max([int compare(TextTrack a, TextTrack b)]) =>
      IterableMixinWorkaround.max(this, compare);

  void insert(int index, TextTrack element) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  TextTrack removeAt(int pos) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  TextTrack removeLast() {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void remove(Object object) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void removeAll(Iterable elements) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void retainAll(Iterable elements) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void removeWhere(bool test(TextTrack element)) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void retainWhere(bool test(TextTrack element)) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void setRange(int start, int rangeLength, List<TextTrack> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [TextTrack initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<TextTrack> sublist(int start, [int end]) {
    if (end == null) end = length;
    return Lists.getRange(this, start, end, <TextTrack>[]);
  }

  List<TextTrack> getRange(int start, int rangeLength) =>
      sublist(start, start + rangeLength);

  Map<int, TextTrack> asMap() =>
    IterableMixinWorkaround.asMapList(this);

  // -- end List<TextTrack> mixins.

  @DomName('TextTrackList.addEventListener')
  @DocsEditable
  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "TextTrackList_addEventListener_Callback";

  @DomName('TextTrackList.dispatchEvent')
  @DocsEditable
  bool dispatchEvent(Event evt) native "TextTrackList_dispatchEvent_Callback";

  @DomName('TextTrackList.item')
  @DocsEditable
  TextTrack item(int index) native "TextTrackList_item_Callback";

  @DomName('TextTrackList.removeEventListener')
  @DocsEditable
  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "TextTrackList_removeEventListener_Callback";

  @DomName('TextTrackList.onaddtrack')
  @DocsEditable
  Stream<TrackEvent> get onAddTrack => addTrackEvent.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.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('TimeRanges')
class TimeRanges extends NativeFieldWrapperClass1 {
  TimeRanges.internal();

  @DomName('TimeRanges.length')
  @DocsEditable
  int get length native "TimeRanges_length_Getter";

  @DomName('TimeRanges.end')
  @DocsEditable
  num end(int index) native "TimeRanges_end_Callback";

  @DomName('TimeRanges.start')
  @DocsEditable
  num start(int index) native "TimeRanges_start_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


typedef void TimeoutHandler();
// 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.


@DocsEditable
@DomName('HTMLTitleElement')
class TitleElement extends _Element_Merged {
  TitleElement.internal() : super.internal();

  @DomName('HTMLTitleElement.HTMLTitleElement')
  @DocsEditable
  factory TitleElement() => document.$dom_createElement("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('Touch')
class Touch extends NativeFieldWrapperClass1 {
  Touch.internal();

  @DomName('Touch.clientX')
  @DocsEditable
  int get $dom_clientX native "Touch_clientX_Getter";

  @DomName('Touch.clientY')
  @DocsEditable
  int get $dom_clientY native "Touch_clientY_Getter";

  @DomName('Touch.identifier')
  @DocsEditable
  int get identifier native "Touch_identifier_Getter";

  @DomName('Touch.pageX')
  @DocsEditable
  int get $dom_pageX native "Touch_pageX_Getter";

  @DomName('Touch.pageY')
  @DocsEditable
  int get $dom_pageY native "Touch_pageY_Getter";

  @DomName('Touch.screenX')
  @DocsEditable
  int get $dom_screenX native "Touch_screenX_Getter";

  @DomName('Touch.screenY')
  @DocsEditable
  int get $dom_screenY native "Touch_screenY_Getter";

  @DomName('Touch.target')
  @DocsEditable
  EventTarget get target native "Touch_target_Getter";

  @DomName('Touch.webkitForce')
  @DocsEditable
  @SupportedBrowser(SupportedBrowser.CHROME)
  @SupportedBrowser(SupportedBrowser.SAFARI)
  @Experimental
  num get force native "Touch_webkitForce_Getter";

  @DomName('Touch.webkitRadiusX')
  @DocsEditable
  @SupportedBrowser(SupportedBrowser.CHROME)
  @SupportedBrowser(SupportedBrowser.SAFARI)
  @Experimental
  int get radiusX native "Touch_webkitRadiusX_Getter";

  @DomName('Touch.webkitRadiusY')
  @DocsEditable
  @SupportedBrowser(SupportedBrowser.CHROME)
  @SupportedBrowser(SupportedBrowser.SAFARI)
  @Experimental
  int get radiusY native "Touch_webkitRadiusY_Getter";

  @DomName('Touch.webkitRotationAngle')
  @DocsEditable
  @SupportedBrowser(SupportedBrowser.CHROME)
  @SupportedBrowser(SupportedBrowser.SAFARI)
  @Experimental
  num get rotationAngle native "Touch_webkitRotationAngle_Getter";


  @DomName('Touch.clientX')
  @DomName('Touch.clientY')
  Point get client => new Point($dom_clientX, $dom_clientY);

  @DomName('Touch.pageX')
  @DomName('Touch.pageY')
  Point get page => new Point($dom_pageX, $dom_pageY);

  @DomName('Touch.screenX')
  @DomName('Touch.screenY')
  Point get screen => new Point($dom_screenX, $dom_screenY);
}
// 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.


@DomName('TouchEvent')
class TouchEvent extends UIEvent {
  factory TouchEvent(TouchList touches, TouchList targetTouches,
      TouchList changedTouches, String type,
      {Window view, int screenX: 0, int screenY: 0, int clientX: 0,
      int clientY: 0, bool ctrlKey: false, bool altKey: false,
      bool shiftKey: false, bool metaKey: false}) {
    if (view == null) {
      view = window;
    }
    var e = document.$dom_createEvent("TouchEvent");
    e.$dom_initTouchEvent(touches, targetTouches, changedTouches, type, view,
        screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey);
    return e;
  }
  TouchEvent.internal() : super.internal();

  @DomName('TouchEvent.altKey')
  @DocsEditable
  bool get altKey native "TouchEvent_altKey_Getter";

  @DomName('TouchEvent.changedTouches')
  @DocsEditable
  TouchList get changedTouches native "TouchEvent_changedTouches_Getter";

  @DomName('TouchEvent.ctrlKey')
  @DocsEditable
  bool get ctrlKey native "TouchEvent_ctrlKey_Getter";

  @DomName('TouchEvent.metaKey')
  @DocsEditable
  bool get metaKey native "TouchEvent_metaKey_Getter";

  @DomName('TouchEvent.shiftKey')
  @DocsEditable
  bool get shiftKey native "TouchEvent_shiftKey_Getter";

  @DomName('TouchEvent.targetTouches')
  @DocsEditable
  TouchList get targetTouches native "TouchEvent_targetTouches_Getter";

  @DomName('TouchEvent.touches')
  @DocsEditable
  TouchList get touches native "TouchEvent_touches_Getter";

  @DomName('TouchEvent.initTouchEvent')
  @DocsEditable
  void $dom_initTouchEvent(TouchList touches, TouchList targetTouches, TouchList changedTouches, String type, Window view, int screenX, int screenY, int clientX, int clientY, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey) native "TouchEvent_initTouchEvent_Callback";


  /**
   * Checks if touch events supported on the current platform.
   *
   * Note that touch events are only supported if the user is using a touch
   * device.
   */
  static bool get supported {
    // Bug #8186 add equivalent 'ontouchstart' check for Dartium.
    // Basically, this is a fairly common check and it'd be great if it did not
    // throw exceptions.
    return Device.isEventTypeSupported('TouchEvent');
  }
}
// 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.


@DomName('TouchList')
class TouchList extends NativeFieldWrapperClass1 implements List<Touch> {
  /// NB: This constructor likely does not work as you might expect it to! This
  /// constructor will simply fail (returning null) if you are not on a device
  /// with touch enabled. See dartbug.com/8314.
  factory TouchList() => document.$dom_createTouchList();
  TouchList.internal();

  /// Checks if this type is supported on the current platform.
  static bool get supported => true;

  @DomName('TouchList.length')
  @DocsEditable
  int get length native "TouchList_length_Getter";

  Touch operator[](int index) native "TouchList_item_Callback";

  void operator[]=(int index, Touch value) {
    throw new UnsupportedError("Cannot assign element of immutable List.");
  }
  // -- start List<Touch> mixins.
  // Touch is the element type.

  // From Iterable<Touch>:

  Iterator<Touch> 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<Touch>(this);
  }

  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, Touch)) {
    return IterableMixinWorkaround.reduce(this, initialValue, combine);
  }

  bool contains(Touch element) => IterableMixinWorkaround.contains(this, element);

  void forEach(void f(Touch element)) => IterableMixinWorkaround.forEach(this, f);

  String join([String separator]) =>
      IterableMixinWorkaround.joinList(this, separator);

  Iterable map(f(Touch element)) =>
      IterableMixinWorkaround.mapList(this, f);

  Iterable<Touch> where(bool f(Touch element)) =>
      IterableMixinWorkaround.where(this, f);

  Iterable expand(Iterable f(Touch element)) =>
      IterableMixinWorkaround.expand(this, f);

  bool every(bool f(Touch element)) => IterableMixinWorkaround.every(this, f);

  bool any(bool f(Touch element)) => IterableMixinWorkaround.any(this, f);

  List<Touch> toList({ bool growable: true }) =>
      new List<Touch>.from(this, growable: growable);

  Set<Touch> toSet() => new Set<Touch>.from(this);

  bool get isEmpty => this.length == 0;

  Iterable<Touch> take(int n) => IterableMixinWorkaround.takeList(this, n);

  Iterable<Touch> takeWhile(bool test(Touch value)) {
    return IterableMixinWorkaround.takeWhile(this, test);
  }

  Iterable<Touch> skip(int n) => IterableMixinWorkaround.skipList(this, n);

  Iterable<Touch> skipWhile(bool test(Touch value)) {
    return IterableMixinWorkaround.skipWhile(this, test);
  }

  Touch firstWhere(bool test(Touch value), { Touch orElse() }) {
    return IterableMixinWorkaround.firstWhere(this, test, orElse);
  }

  Touch lastWhere(bool test(Touch value), {Touch orElse()}) {
    return IterableMixinWorkaround.lastWhereList(this, test, orElse);
  }

  Touch singleWhere(bool test(Touch value)) {
    return IterableMixinWorkaround.singleWhere(this, test);
  }

  Touch elementAt(int index) {
    return this[index];
  }

  // From Collection<Touch>:

  void add(Touch value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(Touch value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Iterable<Touch> iterable) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  // From List<Touch>:
  void set length(int value) {
    throw new UnsupportedError("Cannot resize immutable List.");
  }

  void clear() {
    throw new UnsupportedError("Cannot clear immutable List.");
  }

  Iterable<Touch> get reversed {
    return IterableMixinWorkaround.reversedList(this);
  }

  void sort([int compare(Touch a, Touch b)]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(Touch element, [int start = 0]) =>
      Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(Touch element, [int start]) {
    if (start == null) start = length - 1;
    return Lists.lastIndexOf(this, element, start);
  }

  Touch get first {
    if (this.length > 0) return this[0];
    throw new StateError("No elements");
  }

  Touch get last {
    if (this.length > 0) return this[this.length - 1];
    throw new StateError("No elements");
  }

  Touch get single {
    if (length == 1) return this[0];
    if (length == 0) throw new StateError("No elements");
    throw new StateError("More than one element");
  }

  Touch min([int compare(Touch a, Touch b)]) =>
      IterableMixinWorkaround.min(this, compare);

  Touch max([int compare(Touch a, Touch b)]) =>
      IterableMixinWorkaround.max(this, compare);

  void insert(int index, Touch element) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  Touch removeAt(int pos) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  Touch removeLast() {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void remove(Object object) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void removeAll(Iterable elements) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void retainAll(Iterable elements) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void removeWhere(bool test(Touch element)) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void retainWhere(bool test(Touch element)) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void setRange(int start, int rangeLength, List<Touch> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [Touch initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<Touch> sublist(int start, [int end]) {
    if (end == null) end = length;
    return Lists.getRange(this, start, end, <Touch>[]);
  }

  List<Touch> getRange(int start, int rangeLength) =>
      sublist(start, start + rangeLength);

  Map<int, Touch> asMap() =>
    IterableMixinWorkaround.asMapList(this);

  // -- end List<Touch> mixins.

  @DomName('TouchList.item')
  @DocsEditable
  Touch item(int index) native "TouchList_item_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('HTMLTrackElement')
@SupportedBrowser(SupportedBrowser.CHROME)
@SupportedBrowser(SupportedBrowser.IE, '10')
@SupportedBrowser(SupportedBrowser.SAFARI)
class TrackElement extends _Element_Merged {
  TrackElement.internal() : super.internal();

  @DomName('HTMLTrackElement.HTMLTrackElement')
  @DocsEditable
  factory TrackElement() => document.$dom_createElement("track");

  /// Checks if this type is supported on the current platform.
  static bool get supported => true;

  static const int ERROR = 3;

  static const int LOADED = 2;

  static const int LOADING = 1;

  static const int NONE = 0;

  @DomName('HTMLTrackElement.default')
  @DocsEditable
  bool get defaultValue native "HTMLTrackElement_default_Getter";

  @DomName('HTMLTrackElement.default')
  @DocsEditable
  void set defaultValue(bool value) native "HTMLTrackElement_default_Setter";

  @DomName('HTMLTrackElement.kind')
  @DocsEditable
  String get kind native "HTMLTrackElement_kind_Getter";

  @DomName('HTMLTrackElement.kind')
  @DocsEditable
  void set kind(String value) native "HTMLTrackElement_kind_Setter";

  @DomName('HTMLTrackElement.label')
  @DocsEditable
  String get label native "HTMLTrackElement_label_Getter";

  @DomName('HTMLTrackElement.label')
  @DocsEditable
  void set label(String value) native "HTMLTrackElement_label_Setter";

  @DomName('HTMLTrackElement.readyState')
  @DocsEditable
  int get readyState native "HTMLTrackElement_readyState_Getter";

  @DomName('HTMLTrackElement.src')
  @DocsEditable
  String get src native "HTMLTrackElement_src_Getter";

  @DomName('HTMLTrackElement.src')
  @DocsEditable
  void set src(String value) native "HTMLTrackElement_src_Setter";

  @DomName('HTMLTrackElement.srclang')
  @DocsEditable
  String get srclang native "HTMLTrackElement_srclang_Getter";

  @DomName('HTMLTrackElement.srclang')
  @DocsEditable
  void set srclang(String value) native "HTMLTrackElement_srclang_Setter";

  @DomName('HTMLTrackElement.track')
  @DocsEditable
  TextTrack get track native "HTMLTrackElement_track_Getter";

}
// 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.


@DocsEditable
@DomName('TrackEvent')
class TrackEvent extends Event {
  TrackEvent.internal() : super.internal();

  @DomName('TrackEvent.track')
  @DocsEditable
  Object get track native "TrackEvent_track_Getter";

}
// 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.


@DocsEditable
@DomName('TransitionEvent')
class TransitionEvent extends Event {
  TransitionEvent.internal() : super.internal();

  @DomName('TransitionEvent.elapsedTime')
  @DocsEditable
  num get elapsedTime native "TransitionEvent_elapsedTime_Getter";

  @DomName('TransitionEvent.propertyName')
  @DocsEditable
  String get propertyName native "TransitionEvent_propertyName_Getter";

  @DomName('TransitionEvent.pseudoElement')
  @DocsEditable
  String get pseudoElement native "TransitionEvent_pseudoElement_Getter";

}
// 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.


@DocsEditable
@DomName('TreeWalker')
class TreeWalker extends NativeFieldWrapperClass1 {
  TreeWalker.internal();

  @DomName('TreeWalker.currentNode')
  @DocsEditable
  Node get currentNode native "TreeWalker_currentNode_Getter";

  @DomName('TreeWalker.currentNode')
  @DocsEditable
  void set currentNode(Node value) native "TreeWalker_currentNode_Setter";

  @DomName('TreeWalker.expandEntityReferences')
  @DocsEditable
  bool get expandEntityReferences native "TreeWalker_expandEntityReferences_Getter";

  @DomName('TreeWalker.filter')
  @DocsEditable
  NodeFilter get filter native "TreeWalker_filter_Getter";

  @DomName('TreeWalker.root')
  @DocsEditable
  Node get root native "TreeWalker_root_Getter";

  @DomName('TreeWalker.whatToShow')
  @DocsEditable
  int get whatToShow native "TreeWalker_whatToShow_Getter";

  @DomName('TreeWalker.firstChild')
  @DocsEditable
  Node firstChild() native "TreeWalker_firstChild_Callback";

  @DomName('TreeWalker.lastChild')
  @DocsEditable
  Node lastChild() native "TreeWalker_lastChild_Callback";

  @DomName('TreeWalker.nextNode')
  @DocsEditable
  Node nextNode() native "TreeWalker_nextNode_Callback";

  @DomName('TreeWalker.nextSibling')
  @DocsEditable
  Node nextSibling() native "TreeWalker_nextSibling_Callback";

  @DomName('TreeWalker.parentNode')
  @DocsEditable
  Node parentNode() native "TreeWalker_parentNode_Callback";

  @DomName('TreeWalker.previousNode')
  @DocsEditable
  Node previousNode() native "TreeWalker_previousNode_Callback";

  @DomName('TreeWalker.previousSibling')
  @DocsEditable
  Node previousSibling() native "TreeWalker_previousSibling_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DomName('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;
    }
    final e = document.$dom_createEvent("UIEvent");
    e.$dom_initUIEvent(type, canBubble, cancelable, view, detail);
    return e;
  }
  UIEvent.internal() : super.internal();

  @DomName('UIEvent.charCode')
  @DocsEditable
  int get $dom_charCode native "UIEvent_charCode_Getter";

  @DomName('UIEvent.detail')
  @DocsEditable
  int get detail native "UIEvent_detail_Getter";

  @DomName('UIEvent.keyCode')
  @DocsEditable
  int get $dom_keyCode native "UIEvent_keyCode_Getter";

  @DomName('UIEvent.layerX')
  @DocsEditable
  int get $dom_layerX native "UIEvent_layerX_Getter";

  @DomName('UIEvent.layerY')
  @DocsEditable
  int get $dom_layerY native "UIEvent_layerY_Getter";

  @DomName('UIEvent.pageX')
  @DocsEditable
  int get $dom_pageX native "UIEvent_pageX_Getter";

  @DomName('UIEvent.pageY')
  @DocsEditable
  int get $dom_pageY native "UIEvent_pageY_Getter";

  @DomName('UIEvent.view')
  @DocsEditable
  WindowBase get view native "UIEvent_view_Getter";

  @DomName('UIEvent.which')
  @DocsEditable
  int get which native "UIEvent_which_Getter";

  @DomName('UIEvent.initUIEvent')
  @DocsEditable
  void $dom_initUIEvent(String type, bool canBubble, bool cancelable, Window view, int detail) native "UIEvent_initUIEvent_Callback";


  @deprecated
  int get layerX => layer.x;
  @deprecated
  int get layerY => layer.y;

  @deprecated
  int get pageX => page.x;
  @deprecated
  int get pageY => page.y;

  @DomName('UIEvent.layerX')
  @DomName('UIEvent.layerY')
  Point get layer => new Point($dom_layerX, $dom_layerY);

  @DomName('UIEvent.pageX')
  @DomName('UIEvent.pageY')
  Point get page => new Point($dom_pageX, $dom_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.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('HTMLUListElement')
class UListElement extends _Element_Merged {
  UListElement.internal() : super.internal();

  @DomName('HTMLUListElement.HTMLUListElement')
  @DocsEditable
  factory UListElement() => document.$dom_createElement("ul");

}
// 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.


@DocsEditable
@DomName('Uint16Array')
class Uint16Array extends ArrayBufferView implements List<int> {
  Uint16Array.internal() : super.internal();

  @DomName('Uint16Array.Uint16Array')
  @DocsEditable
  factory Uint16Array(int length) =>
    _TypedArrayFactoryProvider.createUint16Array(length);

  @DomName('Uint16Array.fromList')
  @DocsEditable
  factory Uint16Array.fromList(List<int> list) =>
    _TypedArrayFactoryProvider.createUint16Array_fromList(list);

  @DomName('Uint16Array.fromBuffer')
  @DocsEditable
  factory Uint16Array.fromBuffer(ArrayBuffer buffer, [int byteOffset, int length]) => 
    _TypedArrayFactoryProvider.createUint16Array_fromBuffer(buffer, byteOffset, length);

  static const int BYTES_PER_ELEMENT = 2;

  @DomName('Uint16Array.length')
  @DocsEditable
  int get length native "Uint16Array_length_Getter";

  @DomName('Uint16Array.numericIndexGetter')
  @DocsEditable
  int operator[](int index) native "Uint16Array_numericIndexGetter_Callback";

  @DomName('Uint16Array.numericIndexSetter')
  @DocsEditable
  void operator[]=(int index, int value) native "Uint16Array_numericIndexSetter_Callback";
  // -- start List<int> mixins.
  // int is the element type.

  // From Iterable<int>:

  Iterator<int> 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<int>(this);
  }

  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, int)) {
    return IterableMixinWorkaround.reduce(this, initialValue, combine);
  }

  bool contains(int element) => IterableMixinWorkaround.contains(this, element);

  void forEach(void f(int element)) => IterableMixinWorkaround.forEach(this, f);

  String join([String separator]) =>
      IterableMixinWorkaround.joinList(this, separator);

  Iterable map(f(int element)) =>
      IterableMixinWorkaround.mapList(this, f);

  Iterable<int> where(bool f(int element)) =>
      IterableMixinWorkaround.where(this, f);

  Iterable expand(Iterable f(int element)) =>
      IterableMixinWorkaround.expand(this, f);

  bool every(bool f(int element)) => IterableMixinWorkaround.every(this, f);

  bool any(bool f(int element)) => IterableMixinWorkaround.any(this, f);

  List<int> toList({ bool growable: true }) =>
      new List<int>.from(this, growable: growable);

  Set<int> toSet() => new Set<int>.from(this);

  bool get isEmpty => this.length == 0;

  Iterable<int> take(int n) => IterableMixinWorkaround.takeList(this, n);

  Iterable<int> takeWhile(bool test(int value)) {
    return IterableMixinWorkaround.takeWhile(this, test);
  }

  Iterable<int> skip(int n) => IterableMixinWorkaround.skipList(this, n);

  Iterable<int> skipWhile(bool test(int value)) {
    return IterableMixinWorkaround.skipWhile(this, test);
  }

  int firstWhere(bool test(int value), { int orElse() }) {
    return IterableMixinWorkaround.firstWhere(this, test, orElse);
  }

  int lastWhere(bool test(int value), {int orElse()}) {
    return IterableMixinWorkaround.lastWhereList(this, test, orElse);
  }

  int singleWhere(bool test(int value)) {
    return IterableMixinWorkaround.singleWhere(this, test);
  }

  int elementAt(int index) {
    return this[index];
  }

  // From Collection<int>:

  void add(int value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(int value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Iterable<int> iterable) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  // From List<int>:
  void set length(int value) {
    throw new UnsupportedError("Cannot resize immutable List.");
  }

  void clear() {
    throw new UnsupportedError("Cannot clear immutable List.");
  }

  Iterable<int> get reversed {
    return IterableMixinWorkaround.reversedList(this);
  }

  void sort([int compare(int a, int b)]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(int element, [int start = 0]) =>
      Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(int element, [int start]) {
    if (start == null) start = length - 1;
    return Lists.lastIndexOf(this, element, start);
  }

  int get first {
    if (this.length > 0) return this[0];
    throw new StateError("No elements");
  }

  int get last {
    if (this.length > 0) return this[this.length - 1];
    throw new StateError("No elements");
  }

  int get single {
    if (length == 1) return this[0];
    if (length == 0) throw new StateError("No elements");
    throw new StateError("More than one element");
  }

  int min([int compare(int a, int b)]) =>
      IterableMixinWorkaround.min(this, compare);

  int max([int compare(int a, int b)]) =>
      IterableMixinWorkaround.max(this, compare);

  void insert(int index, int element) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  int removeAt(int pos) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  int removeLast() {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void remove(Object object) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void removeAll(Iterable elements) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void retainAll(Iterable elements) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void removeWhere(bool test(int element)) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void retainWhere(bool test(int element)) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void setRange(int start, int rangeLength, List<int> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [int initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<int> sublist(int start, [int end]) {
    if (end == null) end = length;
    return Lists.getRange(this, start, end, <int>[]);
  }

  List<int> getRange(int start, int rangeLength) =>
      sublist(start, start + rangeLength);

  Map<int, int> asMap() =>
    IterableMixinWorkaround.asMapList(this);

  // -- end List<int> mixins.

  @DomName('Uint16Array.setElements')
  @DocsEditable
  void setElements(Object array, [int offset]) native "Uint16Array_setElements_Callback";

  List<int> subarray(int start, [int end]) {
    if (?end) {
      return _subarray_1(start, end);
    }
    return _subarray_2(start);
  }

  @DomName('Uint16Array._subarray_1')
  @DocsEditable
  List<int> _subarray_1(start, end) native "Uint16Array__subarray_1_Callback";

  @DomName('Uint16Array._subarray_2')
  @DocsEditable
  List<int> _subarray_2(start) native "Uint16Array__subarray_2_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('Uint32Array')
class Uint32Array extends ArrayBufferView implements List<int> {
  Uint32Array.internal() : super.internal();

  @DomName('Uint32Array.Uint32Array')
  @DocsEditable
  factory Uint32Array(int length) =>
    _TypedArrayFactoryProvider.createUint32Array(length);

  @DomName('Uint32Array.fromList')
  @DocsEditable
  factory Uint32Array.fromList(List<int> list) =>
    _TypedArrayFactoryProvider.createUint32Array_fromList(list);

  @DomName('Uint32Array.fromBuffer')
  @DocsEditable
  factory Uint32Array.fromBuffer(ArrayBuffer buffer, [int byteOffset, int length]) => 
    _TypedArrayFactoryProvider.createUint32Array_fromBuffer(buffer, byteOffset, length);

  static const int BYTES_PER_ELEMENT = 4;

  @DomName('Uint32Array.length')
  @DocsEditable
  int get length native "Uint32Array_length_Getter";

  @DomName('Uint32Array.numericIndexGetter')
  @DocsEditable
  int operator[](int index) native "Uint32Array_numericIndexGetter_Callback";

  @DomName('Uint32Array.numericIndexSetter')
  @DocsEditable
  void operator[]=(int index, int value) native "Uint32Array_numericIndexSetter_Callback";
  // -- start List<int> mixins.
  // int is the element type.

  // From Iterable<int>:

  Iterator<int> 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<int>(this);
  }

  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, int)) {
    return IterableMixinWorkaround.reduce(this, initialValue, combine);
  }

  bool contains(int element) => IterableMixinWorkaround.contains(this, element);

  void forEach(void f(int element)) => IterableMixinWorkaround.forEach(this, f);

  String join([String separator]) =>
      IterableMixinWorkaround.joinList(this, separator);

  Iterable map(f(int element)) =>
      IterableMixinWorkaround.mapList(this, f);

  Iterable<int> where(bool f(int element)) =>
      IterableMixinWorkaround.where(this, f);

  Iterable expand(Iterable f(int element)) =>
      IterableMixinWorkaround.expand(this, f);

  bool every(bool f(int element)) => IterableMixinWorkaround.every(this, f);

  bool any(bool f(int element)) => IterableMixinWorkaround.any(this, f);

  List<int> toList({ bool growable: true }) =>
      new List<int>.from(this, growable: growable);

  Set<int> toSet() => new Set<int>.from(this);

  bool get isEmpty => this.length == 0;

  Iterable<int> take(int n) => IterableMixinWorkaround.takeList(this, n);

  Iterable<int> takeWhile(bool test(int value)) {
    return IterableMixinWorkaround.takeWhile(this, test);
  }

  Iterable<int> skip(int n) => IterableMixinWorkaround.skipList(this, n);

  Iterable<int> skipWhile(bool test(int value)) {
    return IterableMixinWorkaround.skipWhile(this, test);
  }

  int firstWhere(bool test(int value), { int orElse() }) {
    return IterableMixinWorkaround.firstWhere(this, test, orElse);
  }

  int lastWhere(bool test(int value), {int orElse()}) {
    return IterableMixinWorkaround.lastWhereList(this, test, orElse);
  }

  int singleWhere(bool test(int value)) {
    return IterableMixinWorkaround.singleWhere(this, test);
  }

  int elementAt(int index) {
    return this[index];
  }

  // From Collection<int>:

  void add(int value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(int value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Iterable<int> iterable) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  // From List<int>:
  void set length(int value) {
    throw new UnsupportedError("Cannot resize immutable List.");
  }

  void clear() {
    throw new UnsupportedError("Cannot clear immutable List.");
  }

  Iterable<int> get reversed {
    return IterableMixinWorkaround.reversedList(this);
  }

  void sort([int compare(int a, int b)]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(int element, [int start = 0]) =>
      Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(int element, [int start]) {
    if (start == null) start = length - 1;
    return Lists.lastIndexOf(this, element, start);
  }

  int get first {
    if (this.length > 0) return this[0];
    throw new StateError("No elements");
  }

  int get last {
    if (this.length > 0) return this[this.length - 1];
    throw new StateError("No elements");
  }

  int get single {
    if (length == 1) return this[0];
    if (length == 0) throw new StateError("No elements");
    throw new StateError("More than one element");
  }

  int min([int compare(int a, int b)]) =>
      IterableMixinWorkaround.min(this, compare);

  int max([int compare(int a, int b)]) =>
      IterableMixinWorkaround.max(this, compare);

  void insert(int index, int element) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  int removeAt(int pos) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  int removeLast() {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void remove(Object object) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void removeAll(Iterable elements) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void retainAll(Iterable elements) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void removeWhere(bool test(int element)) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void retainWhere(bool test(int element)) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void setRange(int start, int rangeLength, List<int> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [int initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<int> sublist(int start, [int end]) {
    if (end == null) end = length;
    return Lists.getRange(this, start, end, <int>[]);
  }

  List<int> getRange(int start, int rangeLength) =>
      sublist(start, start + rangeLength);

  Map<int, int> asMap() =>
    IterableMixinWorkaround.asMapList(this);

  // -- end List<int> mixins.

  @DomName('Uint32Array.setElements')
  @DocsEditable
  void setElements(Object array, [int offset]) native "Uint32Array_setElements_Callback";

  List<int> subarray(int start, [int end]) {
    if (?end) {
      return _subarray_1(start, end);
    }
    return _subarray_2(start);
  }

  @DomName('Uint32Array._subarray_1')
  @DocsEditable
  List<int> _subarray_1(start, end) native "Uint32Array__subarray_1_Callback";

  @DomName('Uint32Array._subarray_2')
  @DocsEditable
  List<int> _subarray_2(start) native "Uint32Array__subarray_2_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('Uint8Array')
class Uint8Array extends ArrayBufferView implements List<int> {
  Uint8Array.internal() : super.internal();

  @DomName('Uint8Array.Uint8Array')
  @DocsEditable
  factory Uint8Array(int length) =>
    _TypedArrayFactoryProvider.createUint8Array(length);

  @DomName('Uint8Array.fromList')
  @DocsEditable
  factory Uint8Array.fromList(List<int> list) =>
    _TypedArrayFactoryProvider.createUint8Array_fromList(list);

  @DomName('Uint8Array.fromBuffer')
  @DocsEditable
  factory Uint8Array.fromBuffer(ArrayBuffer buffer, [int byteOffset, int length]) => 
    _TypedArrayFactoryProvider.createUint8Array_fromBuffer(buffer, byteOffset, length);

  static const int BYTES_PER_ELEMENT = 1;

  @DomName('Uint8Array.length')
  @DocsEditable
  int get length native "Uint8Array_length_Getter";

  @DomName('Uint8Array.numericIndexGetter')
  @DocsEditable
  int operator[](int index) native "Uint8Array_numericIndexGetter_Callback";

  @DomName('Uint8Array.numericIndexSetter')
  @DocsEditable
  void operator[]=(int index, int value) native "Uint8Array_numericIndexSetter_Callback";
  // -- start List<int> mixins.
  // int is the element type.

  // From Iterable<int>:

  Iterator<int> 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<int>(this);
  }

  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, int)) {
    return IterableMixinWorkaround.reduce(this, initialValue, combine);
  }

  bool contains(int element) => IterableMixinWorkaround.contains(this, element);

  void forEach(void f(int element)) => IterableMixinWorkaround.forEach(this, f);

  String join([String separator]) =>
      IterableMixinWorkaround.joinList(this, separator);

  Iterable map(f(int element)) =>
      IterableMixinWorkaround.mapList(this, f);

  Iterable<int> where(bool f(int element)) =>
      IterableMixinWorkaround.where(this, f);

  Iterable expand(Iterable f(int element)) =>
      IterableMixinWorkaround.expand(this, f);

  bool every(bool f(int element)) => IterableMixinWorkaround.every(this, f);

  bool any(bool f(int element)) => IterableMixinWorkaround.any(this, f);

  List<int> toList({ bool growable: true }) =>
      new List<int>.from(this, growable: growable);

  Set<int> toSet() => new Set<int>.from(this);

  bool get isEmpty => this.length == 0;

  Iterable<int> take(int n) => IterableMixinWorkaround.takeList(this, n);

  Iterable<int> takeWhile(bool test(int value)) {
    return IterableMixinWorkaround.takeWhile(this, test);
  }

  Iterable<int> skip(int n) => IterableMixinWorkaround.skipList(this, n);

  Iterable<int> skipWhile(bool test(int value)) {
    return IterableMixinWorkaround.skipWhile(this, test);
  }

  int firstWhere(bool test(int value), { int orElse() }) {
    return IterableMixinWorkaround.firstWhere(this, test, orElse);
  }

  int lastWhere(bool test(int value), {int orElse()}) {
    return IterableMixinWorkaround.lastWhereList(this, test, orElse);
  }

  int singleWhere(bool test(int value)) {
    return IterableMixinWorkaround.singleWhere(this, test);
  }

  int elementAt(int index) {
    return this[index];
  }

  // From Collection<int>:

  void add(int value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(int value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Iterable<int> iterable) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  // From List<int>:
  void set length(int value) {
    throw new UnsupportedError("Cannot resize immutable List.");
  }

  void clear() {
    throw new UnsupportedError("Cannot clear immutable List.");
  }

  Iterable<int> get reversed {
    return IterableMixinWorkaround.reversedList(this);
  }

  void sort([int compare(int a, int b)]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(int element, [int start = 0]) =>
      Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(int element, [int start]) {
    if (start == null) start = length - 1;
    return Lists.lastIndexOf(this, element, start);
  }

  int get first {
    if (this.length > 0) return this[0];
    throw new StateError("No elements");
  }

  int get last {
    if (this.length > 0) return this[this.length - 1];
    throw new StateError("No elements");
  }

  int get single {
    if (length == 1) return this[0];
    if (length == 0) throw new StateError("No elements");
    throw new StateError("More than one element");
  }

  int min([int compare(int a, int b)]) =>
      IterableMixinWorkaround.min(this, compare);

  int max([int compare(int a, int b)]) =>
      IterableMixinWorkaround.max(this, compare);

  void insert(int index, int element) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  int removeAt(int pos) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  int removeLast() {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void remove(Object object) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void removeAll(Iterable elements) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void retainAll(Iterable elements) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void removeWhere(bool test(int element)) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void retainWhere(bool test(int element)) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void setRange(int start, int rangeLength, List<int> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [int initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<int> sublist(int start, [int end]) {
    if (end == null) end = length;
    return Lists.getRange(this, start, end, <int>[]);
  }

  List<int> getRange(int start, int rangeLength) =>
      sublist(start, start + rangeLength);

  Map<int, int> asMap() =>
    IterableMixinWorkaround.asMapList(this);

  // -- end List<int> mixins.

  @DomName('Uint8Array.setElements')
  @DocsEditable
  void setElements(Object array, [int offset]) native "Uint8Array_setElements_Callback";

  List<int> subarray(int start, [int end]) {
    if (?end) {
      return _subarray_1(start, end);
    }
    return _subarray_2(start);
  }

  @DomName('Uint8Array._subarray_1')
  @DocsEditable
  List<int> _subarray_1(start, end) native "Uint8Array__subarray_1_Callback";

  @DomName('Uint8Array._subarray_2')
  @DocsEditable
  List<int> _subarray_2(start) native "Uint8Array__subarray_2_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('Uint8ClampedArray')
class Uint8ClampedArray extends Uint8Array implements List<int> {
  Uint8ClampedArray.internal() : super.internal();

  @DomName('Uint8ClampedArray.Uint8ClampedArray')
  @DocsEditable
  factory Uint8ClampedArray(int length) =>
    _TypedArrayFactoryProvider.createUint8ClampedArray(length);

  @DomName('Uint8ClampedArray.fromList')
  @DocsEditable
  factory Uint8ClampedArray.fromList(List<int> list) =>
    _TypedArrayFactoryProvider.createUint8ClampedArray_fromList(list);

  @DomName('Uint8ClampedArray.fromBuffer')
  @DocsEditable
  factory Uint8ClampedArray.fromBuffer(ArrayBuffer buffer, [int byteOffset, int length]) => 
    _TypedArrayFactoryProvider.createUint8ClampedArray_fromBuffer(buffer, byteOffset, length);

  @DomName('Uint8ClampedArray.length')
  @DocsEditable
  int get length native "Uint8ClampedArray_length_Getter";

  @DomName('Uint8ClampedArray.numericIndexGetter')
  @DocsEditable
  int operator[](int index) native "Uint8ClampedArray_numericIndexGetter_Callback";

  @DomName('Uint8ClampedArray.numericIndexSetter')
  @DocsEditable
  void operator[]=(int index, int value) native "Uint8ClampedArray_numericIndexSetter_Callback";
  // -- start List<int> mixins.
  // int is the element type.

  // From Iterable<int>:

  Iterator<int> 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<int>(this);
  }

  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, int)) {
    return IterableMixinWorkaround.reduce(this, initialValue, combine);
  }

  bool contains(int element) => IterableMixinWorkaround.contains(this, element);

  void forEach(void f(int element)) => IterableMixinWorkaround.forEach(this, f);

  String join([String separator]) =>
      IterableMixinWorkaround.joinList(this, separator);

  Iterable map(f(int element)) =>
      IterableMixinWorkaround.mapList(this, f);

  Iterable<int> where(bool f(int element)) =>
      IterableMixinWorkaround.where(this, f);

  Iterable expand(Iterable f(int element)) =>
      IterableMixinWorkaround.expand(this, f);

  bool every(bool f(int element)) => IterableMixinWorkaround.every(this, f);

  bool any(bool f(int element)) => IterableMixinWorkaround.any(this, f);

  List<int> toList({ bool growable: true }) =>
      new List<int>.from(this, growable: growable);

  Set<int> toSet() => new Set<int>.from(this);

  bool get isEmpty => this.length == 0;

  Iterable<int> take(int n) => IterableMixinWorkaround.takeList(this, n);

  Iterable<int> takeWhile(bool test(int value)) {
    return IterableMixinWorkaround.takeWhile(this, test);
  }

  Iterable<int> skip(int n) => IterableMixinWorkaround.skipList(this, n);

  Iterable<int> skipWhile(bool test(int value)) {
    return IterableMixinWorkaround.skipWhile(this, test);
  }

  int firstWhere(bool test(int value), { int orElse() }) {
    return IterableMixinWorkaround.firstWhere(this, test, orElse);
  }

  int lastWhere(bool test(int value), {int orElse()}) {
    return IterableMixinWorkaround.lastWhereList(this, test, orElse);
  }

  int singleWhere(bool test(int value)) {
    return IterableMixinWorkaround.singleWhere(this, test);
  }

  int elementAt(int index) {
    return this[index];
  }

  // From Collection<int>:

  void add(int value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(int value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Iterable<int> iterable) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  // From List<int>:
  void set length(int value) {
    throw new UnsupportedError("Cannot resize immutable List.");
  }

  void clear() {
    throw new UnsupportedError("Cannot clear immutable List.");
  }

  Iterable<int> get reversed {
    return IterableMixinWorkaround.reversedList(this);
  }

  void sort([int compare(int a, int b)]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(int element, [int start = 0]) =>
      Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(int element, [int start]) {
    if (start == null) start = length - 1;
    return Lists.lastIndexOf(this, element, start);
  }

  int get first {
    if (this.length > 0) return this[0];
    throw new StateError("No elements");
  }

  int get last {
    if (this.length > 0) return this[this.length - 1];
    throw new StateError("No elements");
  }

  int get single {
    if (length == 1) return this[0];
    if (length == 0) throw new StateError("No elements");
    throw new StateError("More than one element");
  }

  int min([int compare(int a, int b)]) =>
      IterableMixinWorkaround.min(this, compare);

  int max([int compare(int a, int b)]) =>
      IterableMixinWorkaround.max(this, compare);

  void insert(int index, int element) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  int removeAt(int pos) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  int removeLast() {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void remove(Object object) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void removeAll(Iterable elements) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void retainAll(Iterable elements) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void removeWhere(bool test(int element)) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void retainWhere(bool test(int element)) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void setRange(int start, int rangeLength, List<int> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [int initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<int> sublist(int start, [int end]) {
    if (end == null) end = length;
    return Lists.getRange(this, start, end, <int>[]);
  }

  List<int> getRange(int start, int rangeLength) =>
      sublist(start, start + rangeLength);

  Map<int, int> asMap() =>
    IterableMixinWorkaround.asMapList(this);

  // -- end List<int> mixins.

  @DomName('Uint8ClampedArray.setElements')
  @DocsEditable
  void setElements(Object array, [int offset]) native "Uint8ClampedArray_setElements_Callback";

  List<int> subarray(int start, [int end]) {
    if (?end) {
      return _subarray_1(start, end);
    }
    return _subarray_2(start);
  }

  @DomName('Uint8ClampedArray._subarray_1')
  @DocsEditable
  List<int> _subarray_1(start, end) native "Uint8ClampedArray__subarray_1_Callback";

  @DomName('Uint8ClampedArray._subarray_2')
  @DocsEditable
  List<int> _subarray_2(start) native "Uint8ClampedArray__subarray_2_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('HTMLUnknownElement')
class UnknownElement extends _Element_Merged {
  UnknownElement.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.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('URL')
class Url extends NativeFieldWrapperClass1 {
  Url.internal();

  static String createObjectUrl(blob_OR_source_OR_stream) {
    if ((blob_OR_source_OR_stream is MediaSource || blob_OR_source_OR_stream == null)) {
      return _createObjectURL_1(blob_OR_source_OR_stream);
    }
    if ((blob_OR_source_OR_stream is MediaStream || blob_OR_source_OR_stream == null)) {
      return _createObjectURL_2(blob_OR_source_OR_stream);
    }
    if ((blob_OR_source_OR_stream is Blob || blob_OR_source_OR_stream == null)) {
      return _createObjectURL_3(blob_OR_source_OR_stream);
    }
    throw new ArgumentError("Incorrect number or type of arguments");
  }

  @DomName('DOMURL._createObjectURL_1')
  @DocsEditable
  static String _createObjectURL_1(blob_OR_source_OR_stream) native "DOMURL__createObjectURL_1_Callback";

  @DomName('DOMURL._createObjectURL_2')
  @DocsEditable
  static String _createObjectURL_2(blob_OR_source_OR_stream) native "DOMURL__createObjectURL_2_Callback";

  @DomName('DOMURL._createObjectURL_3')
  @DocsEditable
  static String _createObjectURL_3(blob_OR_source_OR_stream) native "DOMURL__createObjectURL_3_Callback";

  @DomName('DOMURL.revokeObjectURL')
  @DocsEditable
  static void revokeObjectUrl(String url) native "DOMURL_revokeObjectURL_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('ValidityState')
class ValidityState extends NativeFieldWrapperClass1 {
  ValidityState.internal();

  @DomName('ValidityState.badInput')
  @DocsEditable
  bool get badInput native "ValidityState_badInput_Getter";

  @DomName('ValidityState.customError')
  @DocsEditable
  bool get customError native "ValidityState_customError_Getter";

  @DomName('ValidityState.patternMismatch')
  @DocsEditable
  bool get patternMismatch native "ValidityState_patternMismatch_Getter";

  @DomName('ValidityState.rangeOverflow')
  @DocsEditable
  bool get rangeOverflow native "ValidityState_rangeOverflow_Getter";

  @DomName('ValidityState.rangeUnderflow')
  @DocsEditable
  bool get rangeUnderflow native "ValidityState_rangeUnderflow_Getter";

  @DomName('ValidityState.stepMismatch')
  @DocsEditable
  bool get stepMismatch native "ValidityState_stepMismatch_Getter";

  @DomName('ValidityState.tooLong')
  @DocsEditable
  bool get tooLong native "ValidityState_tooLong_Getter";

  @DomName('ValidityState.typeMismatch')
  @DocsEditable
  bool get typeMismatch native "ValidityState_typeMismatch_Getter";

  @DomName('ValidityState.valid')
  @DocsEditable
  bool get valid native "ValidityState_valid_Getter";

  @DomName('ValidityState.valueMissing')
  @DocsEditable
  bool get valueMissing native "ValidityState_valueMissing_Getter";

}
// 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('HTMLVideoElement')
class VideoElement extends MediaElement implements CanvasImageSource {
  VideoElement.internal() : super.internal();

  @DomName('HTMLVideoElement.HTMLVideoElement')
  @DocsEditable
  factory VideoElement() => document.$dom_createElement("video");

  @DomName('HTMLVideoElement.height')
  @DocsEditable
  int get height native "HTMLVideoElement_height_Getter";

  @DomName('HTMLVideoElement.height')
  @DocsEditable
  void set height(int value) native "HTMLVideoElement_height_Setter";

  @DomName('HTMLVideoElement.poster')
  @DocsEditable
  String get poster native "HTMLVideoElement_poster_Getter";

  @DomName('HTMLVideoElement.poster')
  @DocsEditable
  void set poster(String value) native "HTMLVideoElement_poster_Setter";

  @DomName('HTMLVideoElement.videoHeight')
  @DocsEditable
  int get videoHeight native "HTMLVideoElement_videoHeight_Getter";

  @DomName('HTMLVideoElement.videoWidth')
  @DocsEditable
  int get videoWidth native "HTMLVideoElement_videoWidth_Getter";

  @DomName('HTMLVideoElement.webkitDecodedFrameCount')
  @DocsEditable
  @SupportedBrowser(SupportedBrowser.CHROME)
  @SupportedBrowser(SupportedBrowser.SAFARI)
  @Experimental
  int get decodedFrameCount native "HTMLVideoElement_webkitDecodedFrameCount_Getter";

  @DomName('HTMLVideoElement.webkitDisplayingFullscreen')
  @DocsEditable
  @SupportedBrowser(SupportedBrowser.CHROME)
  @SupportedBrowser(SupportedBrowser.SAFARI)
  @Experimental
  bool get displayingFullscreen native "HTMLVideoElement_webkitDisplayingFullscreen_Getter";

  @DomName('HTMLVideoElement.webkitDroppedFrameCount')
  @DocsEditable
  @SupportedBrowser(SupportedBrowser.CHROME)
  @SupportedBrowser(SupportedBrowser.SAFARI)
  @Experimental
  int get droppedFrameCount native "HTMLVideoElement_webkitDroppedFrameCount_Getter";

  @DomName('HTMLVideoElement.webkitSupportsFullscreen')
  @DocsEditable
  @SupportedBrowser(SupportedBrowser.CHROME)
  @SupportedBrowser(SupportedBrowser.SAFARI)
  @Experimental
  bool get supportsFullscreen native "HTMLVideoElement_webkitSupportsFullscreen_Getter";

  @DomName('HTMLVideoElement.width')
  @DocsEditable
  int get width native "HTMLVideoElement_width_Getter";

  @DomName('HTMLVideoElement.width')
  @DocsEditable
  void set width(int value) native "HTMLVideoElement_width_Setter";

  @DomName('HTMLVideoElement.webkitEnterFullScreen')
  @DocsEditable
  @SupportedBrowser(SupportedBrowser.CHROME)
  @SupportedBrowser(SupportedBrowser.SAFARI)
  @Experimental
  void enterFullScreen() native "HTMLVideoElement_webkitEnterFullScreen_Callback";

  @DomName('HTMLVideoElement.webkitEnterFullscreen')
  @DocsEditable
  @SupportedBrowser(SupportedBrowser.CHROME)
  @SupportedBrowser(SupportedBrowser.SAFARI)
  @Experimental
  void enterFullscreen() native "HTMLVideoElement_webkitEnterFullscreen_Callback";

  @DomName('HTMLVideoElement.webkitExitFullScreen')
  @DocsEditable
  @SupportedBrowser(SupportedBrowser.CHROME)
  @SupportedBrowser(SupportedBrowser.SAFARI)
  @Experimental
  void exitFullScreen() native "HTMLVideoElement_webkitExitFullScreen_Callback";

  @DomName('HTMLVideoElement.webkitExitFullscreen')
  @DocsEditable
  @SupportedBrowser(SupportedBrowser.CHROME)
  @SupportedBrowser(SupportedBrowser.SAFARI)
  @Experimental
  void exitFullscreen() native "HTMLVideoElement_webkitExitFullscreen_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


typedef void VoidCallback();
// 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.


@DocsEditable
@DomName('WebGLActiveInfo')
class WebGLActiveInfo extends NativeFieldWrapperClass1 {
  WebGLActiveInfo.internal();

  @DomName('WebGLActiveInfo.name')
  @DocsEditable
  String get name native "WebGLActiveInfo_name_Getter";

  @DomName('WebGLActiveInfo.size')
  @DocsEditable
  int get size native "WebGLActiveInfo_size_Getter";

  @DomName('WebGLActiveInfo.type')
  @DocsEditable
  int get type native "WebGLActiveInfo_type_Getter";

}
// 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.


@DocsEditable
@DomName('WebGLBuffer')
class WebGLBuffer extends NativeFieldWrapperClass1 {
  WebGLBuffer.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.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('WebGLCompressedTextureS3TC')
class WebGLCompressedTextureS3TC extends NativeFieldWrapperClass1 {
  WebGLCompressedTextureS3TC.internal();

  static const int COMPRESSED_RGBA_S3TC_DXT1_EXT = 0x83F1;

  static const int COMPRESSED_RGBA_S3TC_DXT3_EXT = 0x83F2;

  static const int COMPRESSED_RGBA_S3TC_DXT5_EXT = 0x83F3;

  static const int COMPRESSED_RGB_S3TC_DXT1_EXT = 0x83F0;

}
// 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.


@DocsEditable
@DomName('WebGLContextAttributes')
class WebGLContextAttributes extends NativeFieldWrapperClass1 {
  WebGLContextAttributes.internal();

  @DomName('WebGLContextAttributes.alpha')
  @DocsEditable
  bool get alpha native "WebGLContextAttributes_alpha_Getter";

  @DomName('WebGLContextAttributes.alpha')
  @DocsEditable
  void set alpha(bool value) native "WebGLContextAttributes_alpha_Setter";

  @DomName('WebGLContextAttributes.antialias')
  @DocsEditable
  bool get antialias native "WebGLContextAttributes_antialias_Getter";

  @DomName('WebGLContextAttributes.antialias')
  @DocsEditable
  void set antialias(bool value) native "WebGLContextAttributes_antialias_Setter";

  @DomName('WebGLContextAttributes.depth')
  @DocsEditable
  bool get depth native "WebGLContextAttributes_depth_Getter";

  @DomName('WebGLContextAttributes.depth')
  @DocsEditable
  void set depth(bool value) native "WebGLContextAttributes_depth_Setter";

  @DomName('WebGLContextAttributes.premultipliedAlpha')
  @DocsEditable
  bool get premultipliedAlpha native "WebGLContextAttributes_premultipliedAlpha_Getter";

  @DomName('WebGLContextAttributes.premultipliedAlpha')
  @DocsEditable
  void set premultipliedAlpha(bool value) native "WebGLContextAttributes_premultipliedAlpha_Setter";

  @DomName('WebGLContextAttributes.preserveDrawingBuffer')
  @DocsEditable
  bool get preserveDrawingBuffer native "WebGLContextAttributes_preserveDrawingBuffer_Getter";

  @DomName('WebGLContextAttributes.preserveDrawingBuffer')
  @DocsEditable
  void set preserveDrawingBuffer(bool value) native "WebGLContextAttributes_preserveDrawingBuffer_Setter";

  @DomName('WebGLContextAttributes.stencil')
  @DocsEditable
  bool get stencil native "WebGLContextAttributes_stencil_Getter";

  @DomName('WebGLContextAttributes.stencil')
  @DocsEditable
  void set stencil(bool value) native "WebGLContextAttributes_stencil_Setter";

}
// 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.


@DocsEditable
@DomName('WebGLContextEvent')
class WebGLContextEvent extends Event {
  WebGLContextEvent.internal() : super.internal();

  @DomName('WebGLContextEvent.statusMessage')
  @DocsEditable
  String get statusMessage native "WebGLContextEvent_statusMessage_Getter";

}
// 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.


@DocsEditable
@DomName('WebGLDebugRendererInfo')
class WebGLDebugRendererInfo extends NativeFieldWrapperClass1 {
  WebGLDebugRendererInfo.internal();

  static const int UNMASKED_RENDERER_WEBGL = 0x9246;

  static const int UNMASKED_VENDOR_WEBGL = 0x9245;

}
// 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.


@DocsEditable
@DomName('WebGLDebugShaders')
class WebGLDebugShaders extends NativeFieldWrapperClass1 {
  WebGLDebugShaders.internal();

  @DomName('WebGLDebugShaders.getTranslatedShaderSource')
  @DocsEditable
  String getTranslatedShaderSource(WebGLShader shader) native "WebGLDebugShaders_getTranslatedShaderSource_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('WebGLDepthTexture')
class WebGLDepthTexture extends NativeFieldWrapperClass1 {
  WebGLDepthTexture.internal();

  static const int UNSIGNED_INT_24_8_WEBGL = 0x84FA;

}
// 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.


@DocsEditable
@DomName('WebGLFramebuffer')
class WebGLFramebuffer extends NativeFieldWrapperClass1 {
  WebGLFramebuffer.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.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('WebGLLoseContext')
class WebGLLoseContext extends NativeFieldWrapperClass1 {
  WebGLLoseContext.internal();

  @DomName('WebGLLoseContext.loseContext')
  @DocsEditable
  void loseContext() native "WebGLLoseContext_loseContext_Callback";

  @DomName('WebGLLoseContext.restoreContext')
  @DocsEditable
  void restoreContext() native "WebGLLoseContext_restoreContext_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('WebGLProgram')
class WebGLProgram extends NativeFieldWrapperClass1 {
  WebGLProgram.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.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('WebGLRenderbuffer')
class WebGLRenderbuffer extends NativeFieldWrapperClass1 {
  WebGLRenderbuffer.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.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('WebGLRenderingContext')
@SupportedBrowser(SupportedBrowser.CHROME)
@SupportedBrowser(SupportedBrowser.FIREFOX)
@Experimental
class WebGLRenderingContext extends CanvasRenderingContext {
  WebGLRenderingContext.internal() : super.internal();

  /// Checks if this type is supported on the current platform.
  static bool get supported => true;

  static const int ACTIVE_ATTRIBUTES = 0x8B89;

  static const int ACTIVE_TEXTURE = 0x84E0;

  static const int ACTIVE_UNIFORMS = 0x8B86;

  static const int ALIASED_LINE_WIDTH_RANGE = 0x846E;

  static const int ALIASED_POINT_SIZE_RANGE = 0x846D;

  static const int ALPHA = 0x1906;

  static const int ALPHA_BITS = 0x0D55;

  static const int ALWAYS = 0x0207;

  static const int ARRAY_BUFFER = 0x8892;

  static const int ARRAY_BUFFER_BINDING = 0x8894;

  static const int ATTACHED_SHADERS = 0x8B85;

  static const int BACK = 0x0405;

  static const int BLEND = 0x0BE2;

  static const int BLEND_COLOR = 0x8005;

  static const int BLEND_DST_ALPHA = 0x80CA;

  static const int BLEND_DST_RGB = 0x80C8;

  static const int BLEND_EQUATION = 0x8009;

  static const int BLEND_EQUATION_ALPHA = 0x883D;

  static const int BLEND_EQUATION_RGB = 0x8009;

  static const int BLEND_SRC_ALPHA = 0x80CB;

  static const int BLEND_SRC_RGB = 0x80C9;

  static const int BLUE_BITS = 0x0D54;

  static const int BOOL = 0x8B56;

  static const int BOOL_VEC2 = 0x8B57;

  static const int BOOL_VEC3 = 0x8B58;

  static const int BOOL_VEC4 = 0x8B59;

  static const int BROWSER_DEFAULT_WEBGL = 0x9244;

  static const int BUFFER_SIZE = 0x8764;

  static const int BUFFER_USAGE = 0x8765;

  static const int BYTE = 0x1400;

  static const int CCW = 0x0901;

  static const int CLAMP_TO_EDGE = 0x812F;

  static const int COLOR_ATTACHMENT0 = 0x8CE0;

  static const int COLOR_BUFFER_BIT = 0x00004000;

  static const int COLOR_CLEAR_VALUE = 0x0C22;

  static const int COLOR_WRITEMASK = 0x0C23;

  static const int COMPILE_STATUS = 0x8B81;

  static const int COMPRESSED_TEXTURE_FORMATS = 0x86A3;

  static const int CONSTANT_ALPHA = 0x8003;

  static const int CONSTANT_COLOR = 0x8001;

  static const int CONTEXT_LOST_WEBGL = 0x9242;

  static const int CULL_FACE = 0x0B44;

  static const int CULL_FACE_MODE = 0x0B45;

  static const int CURRENT_PROGRAM = 0x8B8D;

  static const int CURRENT_VERTEX_ATTRIB = 0x8626;

  static const int CW = 0x0900;

  static const int DECR = 0x1E03;

  static const int DECR_WRAP = 0x8508;

  static const int DELETE_STATUS = 0x8B80;

  static const int DEPTH_ATTACHMENT = 0x8D00;

  static const int DEPTH_BITS = 0x0D56;

  static const int DEPTH_BUFFER_BIT = 0x00000100;

  static const int DEPTH_CLEAR_VALUE = 0x0B73;

  static const int DEPTH_COMPONENT = 0x1902;

  static const int DEPTH_COMPONENT16 = 0x81A5;

  static const int DEPTH_FUNC = 0x0B74;

  static const int DEPTH_RANGE = 0x0B70;

  static const int DEPTH_STENCIL = 0x84F9;

  static const int DEPTH_STENCIL_ATTACHMENT = 0x821A;

  static const int DEPTH_TEST = 0x0B71;

  static const int DEPTH_WRITEMASK = 0x0B72;

  static const int DITHER = 0x0BD0;

  static const int DONT_CARE = 0x1100;

  static const int DST_ALPHA = 0x0304;

  static const int DST_COLOR = 0x0306;

  static const int DYNAMIC_DRAW = 0x88E8;

  static const int ELEMENT_ARRAY_BUFFER = 0x8893;

  static const int ELEMENT_ARRAY_BUFFER_BINDING = 0x8895;

  static const int EQUAL = 0x0202;

  static const int FASTEST = 0x1101;

  static const int FLOAT = 0x1406;

  static const int FLOAT_MAT2 = 0x8B5A;

  static const int FLOAT_MAT3 = 0x8B5B;

  static const int FLOAT_MAT4 = 0x8B5C;

  static const int FLOAT_VEC2 = 0x8B50;

  static const int FLOAT_VEC3 = 0x8B51;

  static const int FLOAT_VEC4 = 0x8B52;

  static const int FRAGMENT_SHADER = 0x8B30;

  static const int FRAMEBUFFER = 0x8D40;

  static const int FRAMEBUFFER_ATTACHMENT_OBJECT_NAME = 0x8CD1;

  static const int FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE = 0x8CD0;

  static const int FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE = 0x8CD3;

  static const int FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL = 0x8CD2;

  static const int FRAMEBUFFER_BINDING = 0x8CA6;

  static const int FRAMEBUFFER_COMPLETE = 0x8CD5;

  static const int FRAMEBUFFER_INCOMPLETE_ATTACHMENT = 0x8CD6;

  static const int FRAMEBUFFER_INCOMPLETE_DIMENSIONS = 0x8CD9;

  static const int FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT = 0x8CD7;

  static const int FRAMEBUFFER_UNSUPPORTED = 0x8CDD;

  static const int FRONT = 0x0404;

  static const int FRONT_AND_BACK = 0x0408;

  static const int FRONT_FACE = 0x0B46;

  static const int FUNC_ADD = 0x8006;

  static const int FUNC_REVERSE_SUBTRACT = 0x800B;

  static const int FUNC_SUBTRACT = 0x800A;

  static const int GENERATE_MIPMAP_HINT = 0x8192;

  static const int GEQUAL = 0x0206;

  static const int GREATER = 0x0204;

  static const int GREEN_BITS = 0x0D53;

  static const int HALF_FLOAT_OES = 0x8D61;

  static const int HIGH_FLOAT = 0x8DF2;

  static const int HIGH_INT = 0x8DF5;

  static const int INCR = 0x1E02;

  static const int INCR_WRAP = 0x8507;

  static const int INT = 0x1404;

  static const int INT_VEC2 = 0x8B53;

  static const int INT_VEC3 = 0x8B54;

  static const int INT_VEC4 = 0x8B55;

  static const int INVALID_ENUM = 0x0500;

  static const int INVALID_FRAMEBUFFER_OPERATION = 0x0506;

  static const int INVALID_OPERATION = 0x0502;

  static const int INVALID_VALUE = 0x0501;

  static const int INVERT = 0x150A;

  static const int KEEP = 0x1E00;

  static const int LEQUAL = 0x0203;

  static const int LESS = 0x0201;

  static const int LINEAR = 0x2601;

  static const int LINEAR_MIPMAP_LINEAR = 0x2703;

  static const int LINEAR_MIPMAP_NEAREST = 0x2701;

  static const int LINES = 0x0001;

  static const int LINE_LOOP = 0x0002;

  static const int LINE_STRIP = 0x0003;

  static const int LINE_WIDTH = 0x0B21;

  static const int LINK_STATUS = 0x8B82;

  static const int LOW_FLOAT = 0x8DF0;

  static const int LOW_INT = 0x8DF3;

  static const int LUMINANCE = 0x1909;

  static const int LUMINANCE_ALPHA = 0x190A;

  static const int MAX_COMBINED_TEXTURE_IMAGE_UNITS = 0x8B4D;

  static const int MAX_CUBE_MAP_TEXTURE_SIZE = 0x851C;

  static const int MAX_FRAGMENT_UNIFORM_VECTORS = 0x8DFD;

  static const int MAX_RENDERBUFFER_SIZE = 0x84E8;

  static const int MAX_TEXTURE_IMAGE_UNITS = 0x8872;

  static const int MAX_TEXTURE_SIZE = 0x0D33;

  static const int MAX_VARYING_VECTORS = 0x8DFC;

  static const int MAX_VERTEX_ATTRIBS = 0x8869;

  static const int MAX_VERTEX_TEXTURE_IMAGE_UNITS = 0x8B4C;

  static const int MAX_VERTEX_UNIFORM_VECTORS = 0x8DFB;

  static const int MAX_VIEWPORT_DIMS = 0x0D3A;

  static const int MEDIUM_FLOAT = 0x8DF1;

  static const int MEDIUM_INT = 0x8DF4;

  static const int MIRRORED_REPEAT = 0x8370;

  static const int NEAREST = 0x2600;

  static const int NEAREST_MIPMAP_LINEAR = 0x2702;

  static const int NEAREST_MIPMAP_NEAREST = 0x2700;

  static const int NEVER = 0x0200;

  static const int NICEST = 0x1102;

  static const int NONE = 0;

  static const int NOTEQUAL = 0x0205;

  static const int NO_ERROR = 0;

  static const int ONE = 1;

  static const int ONE_MINUS_CONSTANT_ALPHA = 0x8004;

  static const int ONE_MINUS_CONSTANT_COLOR = 0x8002;

  static const int ONE_MINUS_DST_ALPHA = 0x0305;

  static const int ONE_MINUS_DST_COLOR = 0x0307;

  static const int ONE_MINUS_SRC_ALPHA = 0x0303;

  static const int ONE_MINUS_SRC_COLOR = 0x0301;

  static const int OUT_OF_MEMORY = 0x0505;

  static const int PACK_ALIGNMENT = 0x0D05;

  static const int POINTS = 0x0000;

  static const int POLYGON_OFFSET_FACTOR = 0x8038;

  static const int POLYGON_OFFSET_FILL = 0x8037;

  static const int POLYGON_OFFSET_UNITS = 0x2A00;

  static const int RED_BITS = 0x0D52;

  static const int RENDERBUFFER = 0x8D41;

  static const int RENDERBUFFER_ALPHA_SIZE = 0x8D53;

  static const int RENDERBUFFER_BINDING = 0x8CA7;

  static const int RENDERBUFFER_BLUE_SIZE = 0x8D52;

  static const int RENDERBUFFER_DEPTH_SIZE = 0x8D54;

  static const int RENDERBUFFER_GREEN_SIZE = 0x8D51;

  static const int RENDERBUFFER_HEIGHT = 0x8D43;

  static const int RENDERBUFFER_INTERNAL_FORMAT = 0x8D44;

  static const int RENDERBUFFER_RED_SIZE = 0x8D50;

  static const int RENDERBUFFER_STENCIL_SIZE = 0x8D55;

  static const int RENDERBUFFER_WIDTH = 0x8D42;

  static const int RENDERER = 0x1F01;

  static const int REPEAT = 0x2901;

  static const int REPLACE = 0x1E01;

  static const int RGB = 0x1907;

  static const int RGB565 = 0x8D62;

  static const int RGB5_A1 = 0x8057;

  static const int RGBA = 0x1908;

  static const int RGBA4 = 0x8056;

  static const int SAMPLER_2D = 0x8B5E;

  static const int SAMPLER_CUBE = 0x8B60;

  static const int SAMPLES = 0x80A9;

  static const int SAMPLE_ALPHA_TO_COVERAGE = 0x809E;

  static const int SAMPLE_BUFFERS = 0x80A8;

  static const int SAMPLE_COVERAGE = 0x80A0;

  static const int SAMPLE_COVERAGE_INVERT = 0x80AB;

  static const int SAMPLE_COVERAGE_VALUE = 0x80AA;

  static const int SCISSOR_BOX = 0x0C10;

  static const int SCISSOR_TEST = 0x0C11;

  static const int SHADER_TYPE = 0x8B4F;

  static const int SHADING_LANGUAGE_VERSION = 0x8B8C;

  static const int SHORT = 0x1402;

  static const int SRC_ALPHA = 0x0302;

  static const int SRC_ALPHA_SATURATE = 0x0308;

  static const int SRC_COLOR = 0x0300;

  static const int STATIC_DRAW = 0x88E4;

  static const int STENCIL_ATTACHMENT = 0x8D20;

  static const int STENCIL_BACK_FAIL = 0x8801;

  static const int STENCIL_BACK_FUNC = 0x8800;

  static const int STENCIL_BACK_PASS_DEPTH_FAIL = 0x8802;

  static const int STENCIL_BACK_PASS_DEPTH_PASS = 0x8803;

  static const int STENCIL_BACK_REF = 0x8CA3;

  static const int STENCIL_BACK_VALUE_MASK = 0x8CA4;

  static const int STENCIL_BACK_WRITEMASK = 0x8CA5;

  static const int STENCIL_BITS = 0x0D57;

  static const int STENCIL_BUFFER_BIT = 0x00000400;

  static const int STENCIL_CLEAR_VALUE = 0x0B91;

  static const int STENCIL_FAIL = 0x0B94;

  static const int STENCIL_FUNC = 0x0B92;

  static const int STENCIL_INDEX = 0x1901;

  static const int STENCIL_INDEX8 = 0x8D48;

  static const int STENCIL_PASS_DEPTH_FAIL = 0x0B95;

  static const int STENCIL_PASS_DEPTH_PASS = 0x0B96;

  static const int STENCIL_REF = 0x0B97;

  static const int STENCIL_TEST = 0x0B90;

  static const int STENCIL_VALUE_MASK = 0x0B93;

  static const int STENCIL_WRITEMASK = 0x0B98;

  static const int STREAM_DRAW = 0x88E0;

  static const int SUBPIXEL_BITS = 0x0D50;

  static const int TEXTURE = 0x1702;

  static const int TEXTURE0 = 0x84C0;

  static const int TEXTURE1 = 0x84C1;

  static const int TEXTURE10 = 0x84CA;

  static const int TEXTURE11 = 0x84CB;

  static const int TEXTURE12 = 0x84CC;

  static const int TEXTURE13 = 0x84CD;

  static const int TEXTURE14 = 0x84CE;

  static const int TEXTURE15 = 0x84CF;

  static const int TEXTURE16 = 0x84D0;

  static const int TEXTURE17 = 0x84D1;

  static const int TEXTURE18 = 0x84D2;

  static const int TEXTURE19 = 0x84D3;

  static const int TEXTURE2 = 0x84C2;

  static const int TEXTURE20 = 0x84D4;

  static const int TEXTURE21 = 0x84D5;

  static const int TEXTURE22 = 0x84D6;

  static const int TEXTURE23 = 0x84D7;

  static const int TEXTURE24 = 0x84D8;

  static const int TEXTURE25 = 0x84D9;

  static const int TEXTURE26 = 0x84DA;

  static const int TEXTURE27 = 0x84DB;

  static const int TEXTURE28 = 0x84DC;

  static const int TEXTURE29 = 0x84DD;

  static const int TEXTURE3 = 0x84C3;

  static const int TEXTURE30 = 0x84DE;

  static const int TEXTURE31 = 0x84DF;

  static const int TEXTURE4 = 0x84C4;

  static const int TEXTURE5 = 0x84C5;

  static const int TEXTURE6 = 0x84C6;

  static const int TEXTURE7 = 0x84C7;

  static const int TEXTURE8 = 0x84C8;

  static const int TEXTURE9 = 0x84C9;

  static const int TEXTURE_2D = 0x0DE1;

  static const int TEXTURE_BINDING_2D = 0x8069;

  static const int TEXTURE_BINDING_CUBE_MAP = 0x8514;

  static const int TEXTURE_CUBE_MAP = 0x8513;

  static const int TEXTURE_CUBE_MAP_NEGATIVE_X = 0x8516;

  static const int TEXTURE_CUBE_MAP_NEGATIVE_Y = 0x8518;

  static const int TEXTURE_CUBE_MAP_NEGATIVE_Z = 0x851A;

  static const int TEXTURE_CUBE_MAP_POSITIVE_X = 0x8515;

  static const int TEXTURE_CUBE_MAP_POSITIVE_Y = 0x8517;

  static const int TEXTURE_CUBE_MAP_POSITIVE_Z = 0x8519;

  static const int TEXTURE_MAG_FILTER = 0x2800;

  static const int TEXTURE_MIN_FILTER = 0x2801;

  static const int TEXTURE_WRAP_S = 0x2802;

  static const int TEXTURE_WRAP_T = 0x2803;

  static const int TRIANGLES = 0x0004;

  static const int TRIANGLE_FAN = 0x0006;

  static const int TRIANGLE_STRIP = 0x0005;

  static const int UNPACK_ALIGNMENT = 0x0CF5;

  static const int UNPACK_COLORSPACE_CONVERSION_WEBGL = 0x9243;

  static const int UNPACK_FLIP_Y_WEBGL = 0x9240;

  static const int UNPACK_PREMULTIPLY_ALPHA_WEBGL = 0x9241;

  static const int UNSIGNED_BYTE = 0x1401;

  static const int UNSIGNED_INT = 0x1405;

  static const int UNSIGNED_SHORT = 0x1403;

  static const int UNSIGNED_SHORT_4_4_4_4 = 0x8033;

  static const int UNSIGNED_SHORT_5_5_5_1 = 0x8034;

  static const int UNSIGNED_SHORT_5_6_5 = 0x8363;

  static const int VALIDATE_STATUS = 0x8B83;

  static const int VENDOR = 0x1F00;

  static const int VERSION = 0x1F02;

  static const int VERTEX_ATTRIB_ARRAY_BUFFER_BINDING = 0x889F;

  static const int VERTEX_ATTRIB_ARRAY_ENABLED = 0x8622;

  static const int VERTEX_ATTRIB_ARRAY_NORMALIZED = 0x886A;

  static const int VERTEX_ATTRIB_ARRAY_POINTER = 0x8645;

  static const int VERTEX_ATTRIB_ARRAY_SIZE = 0x8623;

  static const int VERTEX_ATTRIB_ARRAY_STRIDE = 0x8624;

  static const int VERTEX_ATTRIB_ARRAY_TYPE = 0x8625;

  static const int VERTEX_SHADER = 0x8B31;

  static const int VIEWPORT = 0x0BA2;

  static const int ZERO = 0;

  @DomName('WebGLRenderingContext.drawingBufferHeight')
  @DocsEditable
  int get drawingBufferHeight native "WebGLRenderingContext_drawingBufferHeight_Getter";

  @DomName('WebGLRenderingContext.drawingBufferWidth')
  @DocsEditable
  int get drawingBufferWidth native "WebGLRenderingContext_drawingBufferWidth_Getter";

  @DomName('WebGLRenderingContext.activeTexture')
  @DocsEditable
  void activeTexture(int texture) native "WebGLRenderingContext_activeTexture_Callback";

  @DomName('WebGLRenderingContext.attachShader')
  @DocsEditable
  void attachShader(WebGLProgram program, WebGLShader shader) native "WebGLRenderingContext_attachShader_Callback";

  @DomName('WebGLRenderingContext.bindAttribLocation')
  @DocsEditable
  void bindAttribLocation(WebGLProgram program, int index, String name) native "WebGLRenderingContext_bindAttribLocation_Callback";

  @DomName('WebGLRenderingContext.bindBuffer')
  @DocsEditable
  void bindBuffer(int target, WebGLBuffer buffer) native "WebGLRenderingContext_bindBuffer_Callback";

  @DomName('WebGLRenderingContext.bindFramebuffer')
  @DocsEditable
  void bindFramebuffer(int target, WebGLFramebuffer framebuffer) native "WebGLRenderingContext_bindFramebuffer_Callback";

  @DomName('WebGLRenderingContext.bindRenderbuffer')
  @DocsEditable
  void bindRenderbuffer(int target, WebGLRenderbuffer renderbuffer) native "WebGLRenderingContext_bindRenderbuffer_Callback";

  @DomName('WebGLRenderingContext.bindTexture')
  @DocsEditable
  void bindTexture(int target, WebGLTexture texture) native "WebGLRenderingContext_bindTexture_Callback";

  @DomName('WebGLRenderingContext.blendColor')
  @DocsEditable
  void blendColor(num red, num green, num blue, num alpha) native "WebGLRenderingContext_blendColor_Callback";

  @DomName('WebGLRenderingContext.blendEquation')
  @DocsEditable
  void blendEquation(int mode) native "WebGLRenderingContext_blendEquation_Callback";

  @DomName('WebGLRenderingContext.blendEquationSeparate')
  @DocsEditable
  void blendEquationSeparate(int modeRGB, int modeAlpha) native "WebGLRenderingContext_blendEquationSeparate_Callback";

  @DomName('WebGLRenderingContext.blendFunc')
  @DocsEditable
  void blendFunc(int sfactor, int dfactor) native "WebGLRenderingContext_blendFunc_Callback";

  @DomName('WebGLRenderingContext.blendFuncSeparate')
  @DocsEditable
  void blendFuncSeparate(int srcRGB, int dstRGB, int srcAlpha, int dstAlpha) native "WebGLRenderingContext_blendFuncSeparate_Callback";

  void bufferData(int target, data_OR_size, int usage) {
    if ((target is int || target == null) && (data_OR_size is ArrayBufferView || data_OR_size is _typeddata.TypedData || data_OR_size == null) && (usage is int || usage == null)) {
      _bufferData_1(target, data_OR_size, usage);
      return;
    }
    if ((target is int || target == null) && (data_OR_size is ArrayBuffer || data_OR_size is _typeddata.ByteBuffer || data_OR_size == null) && (usage is int || usage == null)) {
      _bufferData_2(target, data_OR_size, usage);
      return;
    }
    if ((target is int || target == null) && (data_OR_size is int || data_OR_size == null) && (usage is int || usage == null)) {
      _bufferData_3(target, data_OR_size, usage);
      return;
    }
    throw new ArgumentError("Incorrect number or type of arguments");
  }

  @DomName('WebGLRenderingContext._bufferData_1')
  @DocsEditable
  void _bufferData_1(target, data_OR_size, usage) native "WebGLRenderingContext__bufferData_1_Callback";

  @DomName('WebGLRenderingContext._bufferData_2')
  @DocsEditable
  void _bufferData_2(target, data_OR_size, usage) native "WebGLRenderingContext__bufferData_2_Callback";

  @DomName('WebGLRenderingContext._bufferData_3')
  @DocsEditable
  void _bufferData_3(target, data_OR_size, usage) native "WebGLRenderingContext__bufferData_3_Callback";

  void bufferSubData(int target, int offset, /*ArrayBuffer*/ data) {
    if ((target is int || target == null) && (offset is int || offset == null) && (data is ArrayBufferView || data is _typeddata.TypedData || data == null)) {
      _bufferSubData_1(target, offset, data);
      return;
    }
    if ((target is int || target == null) && (offset is int || offset == null) && (data is ArrayBuffer || data is _typeddata.ByteBuffer || data == null)) {
      _bufferSubData_2(target, offset, data);
      return;
    }
    throw new ArgumentError("Incorrect number or type of arguments");
  }

  @DomName('WebGLRenderingContext._bufferSubData_1')
  @DocsEditable
  void _bufferSubData_1(target, offset, data) native "WebGLRenderingContext__bufferSubData_1_Callback";

  @DomName('WebGLRenderingContext._bufferSubData_2')
  @DocsEditable
  void _bufferSubData_2(target, offset, data) native "WebGLRenderingContext__bufferSubData_2_Callback";

  @DomName('WebGLRenderingContext.checkFramebufferStatus')
  @DocsEditable
  int checkFramebufferStatus(int target) native "WebGLRenderingContext_checkFramebufferStatus_Callback";

  @DomName('WebGLRenderingContext.clear')
  @DocsEditable
  void clear(int mask) native "WebGLRenderingContext_clear_Callback";

  @DomName('WebGLRenderingContext.clearColor')
  @DocsEditable
  void clearColor(num red, num green, num blue, num alpha) native "WebGLRenderingContext_clearColor_Callback";

  @DomName('WebGLRenderingContext.clearDepth')
  @DocsEditable
  void clearDepth(num depth) native "WebGLRenderingContext_clearDepth_Callback";

  @DomName('WebGLRenderingContext.clearStencil')
  @DocsEditable
  void clearStencil(int s) native "WebGLRenderingContext_clearStencil_Callback";

  @DomName('WebGLRenderingContext.colorMask')
  @DocsEditable
  void colorMask(bool red, bool green, bool blue, bool alpha) native "WebGLRenderingContext_colorMask_Callback";

  @DomName('WebGLRenderingContext.compileShader')
  @DocsEditable
  void compileShader(WebGLShader shader) native "WebGLRenderingContext_compileShader_Callback";

  @DomName('WebGLRenderingContext.compressedTexImage2D')
  @DocsEditable
  void compressedTexImage2D(int target, int level, int internalformat, int width, int height, int border, /*ArrayBufferView*/ data) native "WebGLRenderingContext_compressedTexImage2D_Callback";

  @DomName('WebGLRenderingContext.compressedTexSubImage2D')
  @DocsEditable
  void compressedTexSubImage2D(int target, int level, int xoffset, int yoffset, int width, int height, int format, /*ArrayBufferView*/ data) native "WebGLRenderingContext_compressedTexSubImage2D_Callback";

  @DomName('WebGLRenderingContext.copyTexImage2D')
  @DocsEditable
  void copyTexImage2D(int target, int level, int internalformat, int x, int y, int width, int height, int border) native "WebGLRenderingContext_copyTexImage2D_Callback";

  @DomName('WebGLRenderingContext.copyTexSubImage2D')
  @DocsEditable
  void copyTexSubImage2D(int target, int level, int xoffset, int yoffset, int x, int y, int width, int height) native "WebGLRenderingContext_copyTexSubImage2D_Callback";

  @DomName('WebGLRenderingContext.createBuffer')
  @DocsEditable
  WebGLBuffer createBuffer() native "WebGLRenderingContext_createBuffer_Callback";

  @DomName('WebGLRenderingContext.createFramebuffer')
  @DocsEditable
  WebGLFramebuffer createFramebuffer() native "WebGLRenderingContext_createFramebuffer_Callback";

  @DomName('WebGLRenderingContext.createProgram')
  @DocsEditable
  WebGLProgram createProgram() native "WebGLRenderingContext_createProgram_Callback";

  @DomName('WebGLRenderingContext.createRenderbuffer')
  @DocsEditable
  WebGLRenderbuffer createRenderbuffer() native "WebGLRenderingContext_createRenderbuffer_Callback";

  @DomName('WebGLRenderingContext.createShader')
  @DocsEditable
  WebGLShader createShader(int type) native "WebGLRenderingContext_createShader_Callback";

  @DomName('WebGLRenderingContext.createTexture')
  @DocsEditable
  WebGLTexture createTexture() native "WebGLRenderingContext_createTexture_Callback";

  @DomName('WebGLRenderingContext.cullFace')
  @DocsEditable
  void cullFace(int mode) native "WebGLRenderingContext_cullFace_Callback";

  @DomName('WebGLRenderingContext.deleteBuffer')
  @DocsEditable
  void deleteBuffer(WebGLBuffer buffer) native "WebGLRenderingContext_deleteBuffer_Callback";

  @DomName('WebGLRenderingContext.deleteFramebuffer')
  @DocsEditable
  void deleteFramebuffer(WebGLFramebuffer framebuffer) native "WebGLRenderingContext_deleteFramebuffer_Callback";

  @DomName('WebGLRenderingContext.deleteProgram')
  @DocsEditable
  void deleteProgram(WebGLProgram program) native "WebGLRenderingContext_deleteProgram_Callback";

  @DomName('WebGLRenderingContext.deleteRenderbuffer')
  @DocsEditable
  void deleteRenderbuffer(WebGLRenderbuffer renderbuffer) native "WebGLRenderingContext_deleteRenderbuffer_Callback";

  @DomName('WebGLRenderingContext.deleteShader')
  @DocsEditable
  void deleteShader(WebGLShader shader) native "WebGLRenderingContext_deleteShader_Callback";

  @DomName('WebGLRenderingContext.deleteTexture')
  @DocsEditable
  void deleteTexture(WebGLTexture texture) native "WebGLRenderingContext_deleteTexture_Callback";

  @DomName('WebGLRenderingContext.depthFunc')
  @DocsEditable
  void depthFunc(int func) native "WebGLRenderingContext_depthFunc_Callback";

  @DomName('WebGLRenderingContext.depthMask')
  @DocsEditable
  void depthMask(bool flag) native "WebGLRenderingContext_depthMask_Callback";

  @DomName('WebGLRenderingContext.depthRange')
  @DocsEditable
  void depthRange(num zNear, num zFar) native "WebGLRenderingContext_depthRange_Callback";

  @DomName('WebGLRenderingContext.detachShader')
  @DocsEditable
  void detachShader(WebGLProgram program, WebGLShader shader) native "WebGLRenderingContext_detachShader_Callback";

  @DomName('WebGLRenderingContext.disable')
  @DocsEditable
  void disable(int cap) native "WebGLRenderingContext_disable_Callback";

  @DomName('WebGLRenderingContext.disableVertexAttribArray')
  @DocsEditable
  void disableVertexAttribArray(int index) native "WebGLRenderingContext_disableVertexAttribArray_Callback";

  @DomName('WebGLRenderingContext.drawArrays')
  @DocsEditable
  void drawArrays(int mode, int first, int count) native "WebGLRenderingContext_drawArrays_Callback";

  @DomName('WebGLRenderingContext.drawElements')
  @DocsEditable
  void drawElements(int mode, int count, int type, int offset) native "WebGLRenderingContext_drawElements_Callback";

  @DomName('WebGLRenderingContext.enable')
  @DocsEditable
  void enable(int cap) native "WebGLRenderingContext_enable_Callback";

  @DomName('WebGLRenderingContext.enableVertexAttribArray')
  @DocsEditable
  void enableVertexAttribArray(int index) native "WebGLRenderingContext_enableVertexAttribArray_Callback";

  @DomName('WebGLRenderingContext.finish')
  @DocsEditable
  void finish() native "WebGLRenderingContext_finish_Callback";

  @DomName('WebGLRenderingContext.flush')
  @DocsEditable
  void flush() native "WebGLRenderingContext_flush_Callback";

  @DomName('WebGLRenderingContext.framebufferRenderbuffer')
  @DocsEditable
  void framebufferRenderbuffer(int target, int attachment, int renderbuffertarget, WebGLRenderbuffer renderbuffer) native "WebGLRenderingContext_framebufferRenderbuffer_Callback";

  @DomName('WebGLRenderingContext.framebufferTexture2D')
  @DocsEditable
  void framebufferTexture2D(int target, int attachment, int textarget, WebGLTexture texture, int level) native "WebGLRenderingContext_framebufferTexture2D_Callback";

  @DomName('WebGLRenderingContext.frontFace')
  @DocsEditable
  void frontFace(int mode) native "WebGLRenderingContext_frontFace_Callback";

  @DomName('WebGLRenderingContext.generateMipmap')
  @DocsEditable
  void generateMipmap(int target) native "WebGLRenderingContext_generateMipmap_Callback";

  @DomName('WebGLRenderingContext.getActiveAttrib')
  @DocsEditable
  WebGLActiveInfo getActiveAttrib(WebGLProgram program, int index) native "WebGLRenderingContext_getActiveAttrib_Callback";

  @DomName('WebGLRenderingContext.getActiveUniform')
  @DocsEditable
  WebGLActiveInfo getActiveUniform(WebGLProgram program, int index) native "WebGLRenderingContext_getActiveUniform_Callback";

  @DomName('WebGLRenderingContext.getAttachedShaders')
  @DocsEditable
  void getAttachedShaders(WebGLProgram program) native "WebGLRenderingContext_getAttachedShaders_Callback";

  @DomName('WebGLRenderingContext.getAttribLocation')
  @DocsEditable
  int getAttribLocation(WebGLProgram program, String name) native "WebGLRenderingContext_getAttribLocation_Callback";

  @DomName('WebGLRenderingContext.getBufferParameter')
  @DocsEditable
  Object getBufferParameter(int target, int pname) native "WebGLRenderingContext_getBufferParameter_Callback";

  @DomName('WebGLRenderingContext.getContextAttributes')
  @DocsEditable
  WebGLContextAttributes getContextAttributes() native "WebGLRenderingContext_getContextAttributes_Callback";

  @DomName('WebGLRenderingContext.getError')
  @DocsEditable
  int getError() native "WebGLRenderingContext_getError_Callback";

  @DomName('WebGLRenderingContext.getExtension')
  @DocsEditable
  Object getExtension(String name) native "WebGLRenderingContext_getExtension_Callback";

  @DomName('WebGLRenderingContext.getFramebufferAttachmentParameter')
  @DocsEditable
  Object getFramebufferAttachmentParameter(int target, int attachment, int pname) native "WebGLRenderingContext_getFramebufferAttachmentParameter_Callback";

  @DomName('WebGLRenderingContext.getParameter')
  @DocsEditable
  Object getParameter(int pname) native "WebGLRenderingContext_getParameter_Callback";

  @DomName('WebGLRenderingContext.getProgramInfoLog')
  @DocsEditable
  String getProgramInfoLog(WebGLProgram program) native "WebGLRenderingContext_getProgramInfoLog_Callback";

  @DomName('WebGLRenderingContext.getProgramParameter')
  @DocsEditable
  Object getProgramParameter(WebGLProgram program, int pname) native "WebGLRenderingContext_getProgramParameter_Callback";

  @DomName('WebGLRenderingContext.getRenderbufferParameter')
  @DocsEditable
  Object getRenderbufferParameter(int target, int pname) native "WebGLRenderingContext_getRenderbufferParameter_Callback";

  @DomName('WebGLRenderingContext.getShaderInfoLog')
  @DocsEditable
  String getShaderInfoLog(WebGLShader shader) native "WebGLRenderingContext_getShaderInfoLog_Callback";

  @DomName('WebGLRenderingContext.getShaderParameter')
  @DocsEditable
  Object getShaderParameter(WebGLShader shader, int pname) native "WebGLRenderingContext_getShaderParameter_Callback";

  @DomName('WebGLRenderingContext.getShaderPrecisionFormat')
  @DocsEditable
  WebGLShaderPrecisionFormat getShaderPrecisionFormat(int shadertype, int precisiontype) native "WebGLRenderingContext_getShaderPrecisionFormat_Callback";

  @DomName('WebGLRenderingContext.getShaderSource')
  @DocsEditable
  String getShaderSource(WebGLShader shader) native "WebGLRenderingContext_getShaderSource_Callback";

  @DomName('WebGLRenderingContext.getSupportedExtensions')
  @DocsEditable
  List<String> getSupportedExtensions() native "WebGLRenderingContext_getSupportedExtensions_Callback";

  @DomName('WebGLRenderingContext.getTexParameter')
  @DocsEditable
  Object getTexParameter(int target, int pname) native "WebGLRenderingContext_getTexParameter_Callback";

  @DomName('WebGLRenderingContext.getUniform')
  @DocsEditable
  Object getUniform(WebGLProgram program, WebGLUniformLocation location) native "WebGLRenderingContext_getUniform_Callback";

  @DomName('WebGLRenderingContext.getUniformLocation')
  @DocsEditable
  WebGLUniformLocation getUniformLocation(WebGLProgram program, String name) native "WebGLRenderingContext_getUniformLocation_Callback";

  @DomName('WebGLRenderingContext.getVertexAttrib')
  @DocsEditable
  Object getVertexAttrib(int index, int pname) native "WebGLRenderingContext_getVertexAttrib_Callback";

  @DomName('WebGLRenderingContext.getVertexAttribOffset')
  @DocsEditable
  int getVertexAttribOffset(int index, int pname) native "WebGLRenderingContext_getVertexAttribOffset_Callback";

  @DomName('WebGLRenderingContext.hint')
  @DocsEditable
  void hint(int target, int mode) native "WebGLRenderingContext_hint_Callback";

  @DomName('WebGLRenderingContext.isBuffer')
  @DocsEditable
  bool isBuffer(WebGLBuffer buffer) native "WebGLRenderingContext_isBuffer_Callback";

  @DomName('WebGLRenderingContext.isContextLost')
  @DocsEditable
  bool isContextLost() native "WebGLRenderingContext_isContextLost_Callback";

  @DomName('WebGLRenderingContext.isEnabled')
  @DocsEditable
  bool isEnabled(int cap) native "WebGLRenderingContext_isEnabled_Callback";

  @DomName('WebGLRenderingContext.isFramebuffer')
  @DocsEditable
  bool isFramebuffer(WebGLFramebuffer framebuffer) native "WebGLRenderingContext_isFramebuffer_Callback";

  @DomName('WebGLRenderingContext.isProgram')
  @DocsEditable
  bool isProgram(WebGLProgram program) native "WebGLRenderingContext_isProgram_Callback";

  @DomName('WebGLRenderingContext.isRenderbuffer')
  @DocsEditable
  bool isRenderbuffer(WebGLRenderbuffer renderbuffer) native "WebGLRenderingContext_isRenderbuffer_Callback";

  @DomName('WebGLRenderingContext.isShader')
  @DocsEditable
  bool isShader(WebGLShader shader) native "WebGLRenderingContext_isShader_Callback";

  @DomName('WebGLRenderingContext.isTexture')
  @DocsEditable
  bool isTexture(WebGLTexture texture) native "WebGLRenderingContext_isTexture_Callback";

  @DomName('WebGLRenderingContext.lineWidth')
  @DocsEditable
  void lineWidth(num width) native "WebGLRenderingContext_lineWidth_Callback";

  @DomName('WebGLRenderingContext.linkProgram')
  @DocsEditable
  void linkProgram(WebGLProgram program) native "WebGLRenderingContext_linkProgram_Callback";

  @DomName('WebGLRenderingContext.pixelStorei')
  @DocsEditable
  void pixelStorei(int pname, int param) native "WebGLRenderingContext_pixelStorei_Callback";

  @DomName('WebGLRenderingContext.polygonOffset')
  @DocsEditable
  void polygonOffset(num factor, num units) native "WebGLRenderingContext_polygonOffset_Callback";

  @DomName('WebGLRenderingContext.readPixels')
  @DocsEditable
  void readPixels(int x, int y, int width, int height, int format, int type, /*ArrayBufferView*/ pixels) native "WebGLRenderingContext_readPixels_Callback";

  @DomName('WebGLRenderingContext.releaseShaderCompiler')
  @DocsEditable
  void releaseShaderCompiler() native "WebGLRenderingContext_releaseShaderCompiler_Callback";

  @DomName('WebGLRenderingContext.renderbufferStorage')
  @DocsEditable
  void renderbufferStorage(int target, int internalformat, int width, int height) native "WebGLRenderingContext_renderbufferStorage_Callback";

  @DomName('WebGLRenderingContext.sampleCoverage')
  @DocsEditable
  void sampleCoverage(num value, bool invert) native "WebGLRenderingContext_sampleCoverage_Callback";

  @DomName('WebGLRenderingContext.scissor')
  @DocsEditable
  void scissor(int x, int y, int width, int height) native "WebGLRenderingContext_scissor_Callback";

  @DomName('WebGLRenderingContext.shaderSource')
  @DocsEditable
  void shaderSource(WebGLShader shader, String string) native "WebGLRenderingContext_shaderSource_Callback";

  @DomName('WebGLRenderingContext.stencilFunc')
  @DocsEditable
  void stencilFunc(int func, int ref, int mask) native "WebGLRenderingContext_stencilFunc_Callback";

  @DomName('WebGLRenderingContext.stencilFuncSeparate')
  @DocsEditable
  void stencilFuncSeparate(int face, int func, int ref, int mask) native "WebGLRenderingContext_stencilFuncSeparate_Callback";

  @DomName('WebGLRenderingContext.stencilMask')
  @DocsEditable
  void stencilMask(int mask) native "WebGLRenderingContext_stencilMask_Callback";

  @DomName('WebGLRenderingContext.stencilMaskSeparate')
  @DocsEditable
  void stencilMaskSeparate(int face, int mask) native "WebGLRenderingContext_stencilMaskSeparate_Callback";

  @DomName('WebGLRenderingContext.stencilOp')
  @DocsEditable
  void stencilOp(int fail, int zfail, int zpass) native "WebGLRenderingContext_stencilOp_Callback";

  @DomName('WebGLRenderingContext.stencilOpSeparate')
  @DocsEditable
  void stencilOpSeparate(int face, int fail, int zfail, int zpass) native "WebGLRenderingContext_stencilOpSeparate_Callback";

  void texImage2D(int target, int level, int internalformat, int format_OR_width, int height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video, [int format, int type, /*ArrayBufferView*/ pixels]) {
    if ((target is int || target == null) && (level is int || level == null) && (internalformat is int || internalformat == null) && (format_OR_width is int || format_OR_width == null) && (height_OR_type is int || height_OR_type == null) && (border_OR_canvas_OR_image_OR_pixels_OR_video is int || border_OR_canvas_OR_image_OR_pixels_OR_video == null) && (format is int || format == null) && (type is int || type == null) && (pixels is ArrayBufferView || pixels is _typeddata.TypedData || pixels == null)) {
      _texImage2D_1(target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video, format, type, pixels);
      return;
    }
    if ((target is int || target == null) && (level is int || level == null) && (internalformat is int || internalformat == null) && (format_OR_width is int || format_OR_width == null) && (height_OR_type is int || height_OR_type == null) && (border_OR_canvas_OR_image_OR_pixels_OR_video is ImageData || border_OR_canvas_OR_image_OR_pixels_OR_video == null) && !?format && !?type && !?pixels) {
      _texImage2D_2(target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
      return;
    }
    if ((target is int || target == null) && (level is int || level == null) && (internalformat is int || internalformat == null) && (format_OR_width is int || format_OR_width == null) && (height_OR_type is int || height_OR_type == null) && (border_OR_canvas_OR_image_OR_pixels_OR_video is ImageElement || border_OR_canvas_OR_image_OR_pixels_OR_video == null) && !?format && !?type && !?pixels) {
      _texImage2D_3(target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
      return;
    }
    if ((target is int || target == null) && (level is int || level == null) && (internalformat is int || internalformat == null) && (format_OR_width is int || format_OR_width == null) && (height_OR_type is int || height_OR_type == null) && (border_OR_canvas_OR_image_OR_pixels_OR_video is CanvasElement || border_OR_canvas_OR_image_OR_pixels_OR_video == null) && !?format && !?type && !?pixels) {
      _texImage2D_4(target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
      return;
    }
    if ((target is int || target == null) && (level is int || level == null) && (internalformat is int || internalformat == null) && (format_OR_width is int || format_OR_width == null) && (height_OR_type is int || height_OR_type == null) && (border_OR_canvas_OR_image_OR_pixels_OR_video is VideoElement || border_OR_canvas_OR_image_OR_pixels_OR_video == null) && !?format && !?type && !?pixels) {
      _texImage2D_5(target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
      return;
    }
    throw new ArgumentError("Incorrect number or type of arguments");
  }

  @DomName('WebGLRenderingContext._texImage2D_1')
  @DocsEditable
  void _texImage2D_1(target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video, format, type, pixels) native "WebGLRenderingContext__texImage2D_1_Callback";

  @DomName('WebGLRenderingContext._texImage2D_2')
  @DocsEditable
  void _texImage2D_2(target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext__texImage2D_2_Callback";

  @DomName('WebGLRenderingContext._texImage2D_3')
  @DocsEditable
  void _texImage2D_3(target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext__texImage2D_3_Callback";

  @DomName('WebGLRenderingContext._texImage2D_4')
  @DocsEditable
  void _texImage2D_4(target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext__texImage2D_4_Callback";

  @DomName('WebGLRenderingContext._texImage2D_5')
  @DocsEditable
  void _texImage2D_5(target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext__texImage2D_5_Callback";

  @DomName('WebGLRenderingContext.texParameterf')
  @DocsEditable
  void texParameterf(int target, int pname, num param) native "WebGLRenderingContext_texParameterf_Callback";

  @DomName('WebGLRenderingContext.texParameteri')
  @DocsEditable
  void texParameteri(int target, int pname, int param) native "WebGLRenderingContext_texParameteri_Callback";

  void texSubImage2D(int target, int level, int xoffset, int yoffset, int format_OR_width, int height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video, [int type, /*ArrayBufferView*/ pixels]) {
    if ((target is int || target == null) && (level is int || level == null) && (xoffset is int || xoffset == null) && (yoffset is int || yoffset == null) && (format_OR_width is int || format_OR_width == null) && (height_OR_type is int || height_OR_type == null) && (canvas_OR_format_OR_image_OR_pixels_OR_video is int || canvas_OR_format_OR_image_OR_pixels_OR_video == null) && (type is int || type == null) && (pixels is ArrayBufferView || pixels is _typeddata.TypedData || pixels == null)) {
      _texSubImage2D_1(target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video, type, pixels);
      return;
    }
    if ((target is int || target == null) && (level is int || level == null) && (xoffset is int || xoffset == null) && (yoffset is int || yoffset == null) && (format_OR_width is int || format_OR_width == null) && (height_OR_type is int || height_OR_type == null) && (canvas_OR_format_OR_image_OR_pixels_OR_video is ImageData || canvas_OR_format_OR_image_OR_pixels_OR_video == null) && !?type && !?pixels) {
      _texSubImage2D_2(target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
      return;
    }
    if ((target is int || target == null) && (level is int || level == null) && (xoffset is int || xoffset == null) && (yoffset is int || yoffset == null) && (format_OR_width is int || format_OR_width == null) && (height_OR_type is int || height_OR_type == null) && (canvas_OR_format_OR_image_OR_pixels_OR_video is ImageElement || canvas_OR_format_OR_image_OR_pixels_OR_video == null) && !?type && !?pixels) {
      _texSubImage2D_3(target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
      return;
    }
    if ((target is int || target == null) && (level is int || level == null) && (xoffset is int || xoffset == null) && (yoffset is int || yoffset == null) && (format_OR_width is int || format_OR_width == null) && (height_OR_type is int || height_OR_type == null) && (canvas_OR_format_OR_image_OR_pixels_OR_video is CanvasElement || canvas_OR_format_OR_image_OR_pixels_OR_video == null) && !?type && !?pixels) {
      _texSubImage2D_4(target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
      return;
    }
    if ((target is int || target == null) && (level is int || level == null) && (xoffset is int || xoffset == null) && (yoffset is int || yoffset == null) && (format_OR_width is int || format_OR_width == null) && (height_OR_type is int || height_OR_type == null) && (canvas_OR_format_OR_image_OR_pixels_OR_video is VideoElement || canvas_OR_format_OR_image_OR_pixels_OR_video == null) && !?type && !?pixels) {
      _texSubImage2D_5(target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
      return;
    }
    throw new ArgumentError("Incorrect number or type of arguments");
  }

  @DomName('WebGLRenderingContext._texSubImage2D_1')
  @DocsEditable
  void _texSubImage2D_1(target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video, type, pixels) native "WebGLRenderingContext__texSubImage2D_1_Callback";

  @DomName('WebGLRenderingContext._texSubImage2D_2')
  @DocsEditable
  void _texSubImage2D_2(target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext__texSubImage2D_2_Callback";

  @DomName('WebGLRenderingContext._texSubImage2D_3')
  @DocsEditable
  void _texSubImage2D_3(target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext__texSubImage2D_3_Callback";

  @DomName('WebGLRenderingContext._texSubImage2D_4')
  @DocsEditable
  void _texSubImage2D_4(target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext__texSubImage2D_4_Callback";

  @DomName('WebGLRenderingContext._texSubImage2D_5')
  @DocsEditable
  void _texSubImage2D_5(target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext__texSubImage2D_5_Callback";

  @DomName('WebGLRenderingContext.uniform1f')
  @DocsEditable
  void uniform1f(WebGLUniformLocation location, num x) native "WebGLRenderingContext_uniform1f_Callback";

  @DomName('WebGLRenderingContext.uniform1fv')
  @DocsEditable
  void uniform1fv(WebGLUniformLocation location, List<double> v) native "WebGLRenderingContext_uniform1fv_Callback";

  @DomName('WebGLRenderingContext.uniform1i')
  @DocsEditable
  void uniform1i(WebGLUniformLocation location, int x) native "WebGLRenderingContext_uniform1i_Callback";

  @DomName('WebGLRenderingContext.uniform1iv')
  @DocsEditable
  void uniform1iv(WebGLUniformLocation location, List<int> v) native "WebGLRenderingContext_uniform1iv_Callback";

  @DomName('WebGLRenderingContext.uniform2f')
  @DocsEditable
  void uniform2f(WebGLUniformLocation location, num x, num y) native "WebGLRenderingContext_uniform2f_Callback";

  @DomName('WebGLRenderingContext.uniform2fv')
  @DocsEditable
  void uniform2fv(WebGLUniformLocation location, List<double> v) native "WebGLRenderingContext_uniform2fv_Callback";

  @DomName('WebGLRenderingContext.uniform2i')
  @DocsEditable
  void uniform2i(WebGLUniformLocation location, int x, int y) native "WebGLRenderingContext_uniform2i_Callback";

  @DomName('WebGLRenderingContext.uniform2iv')
  @DocsEditable
  void uniform2iv(WebGLUniformLocation location, List<int> v) native "WebGLRenderingContext_uniform2iv_Callback";

  @DomName('WebGLRenderingContext.uniform3f')
  @DocsEditable
  void uniform3f(WebGLUniformLocation location, num x, num y, num z) native "WebGLRenderingContext_uniform3f_Callback";

  @DomName('WebGLRenderingContext.uniform3fv')
  @DocsEditable
  void uniform3fv(WebGLUniformLocation location, List<double> v) native "WebGLRenderingContext_uniform3fv_Callback";

  @DomName('WebGLRenderingContext.uniform3i')
  @DocsEditable
  void uniform3i(WebGLUniformLocation location, int x, int y, int z) native "WebGLRenderingContext_uniform3i_Callback";

  @DomName('WebGLRenderingContext.uniform3iv')
  @DocsEditable
  void uniform3iv(WebGLUniformLocation location, List<int> v) native "WebGLRenderingContext_uniform3iv_Callback";

  @DomName('WebGLRenderingContext.uniform4f')
  @DocsEditable
  void uniform4f(WebGLUniformLocation location, num x, num y, num z, num w) native "WebGLRenderingContext_uniform4f_Callback";

  @DomName('WebGLRenderingContext.uniform4fv')
  @DocsEditable
  void uniform4fv(WebGLUniformLocation location, List<double> v) native "WebGLRenderingContext_uniform4fv_Callback";

  @DomName('WebGLRenderingContext.uniform4i')
  @DocsEditable
  void uniform4i(WebGLUniformLocation location, int x, int y, int z, int w) native "WebGLRenderingContext_uniform4i_Callback";

  @DomName('WebGLRenderingContext.uniform4iv')
  @DocsEditable
  void uniform4iv(WebGLUniformLocation location, List<int> v) native "WebGLRenderingContext_uniform4iv_Callback";

  @DomName('WebGLRenderingContext.uniformMatrix2fv')
  @DocsEditable
  void uniformMatrix2fv(WebGLUniformLocation location, bool transpose, List<double> array) native "WebGLRenderingContext_uniformMatrix2fv_Callback";

  @DomName('WebGLRenderingContext.uniformMatrix3fv')
  @DocsEditable
  void uniformMatrix3fv(WebGLUniformLocation location, bool transpose, List<double> array) native "WebGLRenderingContext_uniformMatrix3fv_Callback";

  @DomName('WebGLRenderingContext.uniformMatrix4fv')
  @DocsEditable
  void uniformMatrix4fv(WebGLUniformLocation location, bool transpose, List<double> array) native "WebGLRenderingContext_uniformMatrix4fv_Callback";

  @DomName('WebGLRenderingContext.useProgram')
  @DocsEditable
  void useProgram(WebGLProgram program) native "WebGLRenderingContext_useProgram_Callback";

  @DomName('WebGLRenderingContext.validateProgram')
  @DocsEditable
  void validateProgram(WebGLProgram program) native "WebGLRenderingContext_validateProgram_Callback";

  @DomName('WebGLRenderingContext.vertexAttrib1f')
  @DocsEditable
  void vertexAttrib1f(int indx, num x) native "WebGLRenderingContext_vertexAttrib1f_Callback";

  @DomName('WebGLRenderingContext.vertexAttrib1fv')
  @DocsEditable
  void vertexAttrib1fv(int indx, List<double> values) native "WebGLRenderingContext_vertexAttrib1fv_Callback";

  @DomName('WebGLRenderingContext.vertexAttrib2f')
  @DocsEditable
  void vertexAttrib2f(int indx, num x, num y) native "WebGLRenderingContext_vertexAttrib2f_Callback";

  @DomName('WebGLRenderingContext.vertexAttrib2fv')
  @DocsEditable
  void vertexAttrib2fv(int indx, List<double> values) native "WebGLRenderingContext_vertexAttrib2fv_Callback";

  @DomName('WebGLRenderingContext.vertexAttrib3f')
  @DocsEditable
  void vertexAttrib3f(int indx, num x, num y, num z) native "WebGLRenderingContext_vertexAttrib3f_Callback";

  @DomName('WebGLRenderingContext.vertexAttrib3fv')
  @DocsEditable
  void vertexAttrib3fv(int indx, List<double> values) native "WebGLRenderingContext_vertexAttrib3fv_Callback";

  @DomName('WebGLRenderingContext.vertexAttrib4f')
  @DocsEditable
  void vertexAttrib4f(int indx, num x, num y, num z, num w) native "WebGLRenderingContext_vertexAttrib4f_Callback";

  @DomName('WebGLRenderingContext.vertexAttrib4fv')
  @DocsEditable
  void vertexAttrib4fv(int indx, List<double> values) native "WebGLRenderingContext_vertexAttrib4fv_Callback";

  @DomName('WebGLRenderingContext.vertexAttribPointer')
  @DocsEditable
  void vertexAttribPointer(int indx, int size, int type, bool normalized, int stride, int offset) native "WebGLRenderingContext_vertexAttribPointer_Callback";

  @DomName('WebGLRenderingContext.viewport')
  @DocsEditable
  void viewport(int x, int y, int width, int height) native "WebGLRenderingContext_viewport_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('WebGLShader')
class WebGLShader extends NativeFieldWrapperClass1 {
  WebGLShader.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.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('WebGLShaderPrecisionFormat')
class WebGLShaderPrecisionFormat extends NativeFieldWrapperClass1 {
  WebGLShaderPrecisionFormat.internal();

  @DomName('WebGLShaderPrecisionFormat.precision')
  @DocsEditable
  int get precision native "WebGLShaderPrecisionFormat_precision_Getter";

  @DomName('WebGLShaderPrecisionFormat.rangeMax')
  @DocsEditable
  int get rangeMax native "WebGLShaderPrecisionFormat_rangeMax_Getter";

  @DomName('WebGLShaderPrecisionFormat.rangeMin')
  @DocsEditable
  int get rangeMin native "WebGLShaderPrecisionFormat_rangeMin_Getter";

}
// 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.


@DocsEditable
@DomName('WebGLTexture')
class WebGLTexture extends NativeFieldWrapperClass1 {
  WebGLTexture.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.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('WebGLUniformLocation')
class WebGLUniformLocation extends NativeFieldWrapperClass1 {
  WebGLUniformLocation.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.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('WebGLVertexArrayObjectOES')
class WebGLVertexArrayObject extends NativeFieldWrapperClass1 {
  WebGLVertexArrayObject.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.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('WebKitCSSFilterRule')
class WebKitCssFilterRule extends CssRule {
  WebKitCssFilterRule.internal() : super.internal();

  @DomName('WebKitCSSFilterRule.style')
  @DocsEditable
  CssStyleDeclaration get style native "WebKitCSSFilterRule_style_Getter";

}
// 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.


@DocsEditable
@DomName('WebKitCSSFilterValue')
class WebKitCssFilterValue extends _CssValueList {
  WebKitCssFilterValue.internal() : super.internal();

  static const int CSS_FILTER_BLUR = 10;

  static const int CSS_FILTER_BRIGHTNESS = 8;

  static const int CSS_FILTER_CONTRAST = 9;

  static const int CSS_FILTER_CUSTOM = 12;

  static const int CSS_FILTER_DROP_SHADOW = 11;

  static const int CSS_FILTER_GRAYSCALE = 2;

  static const int CSS_FILTER_HUE_ROTATE = 5;

  static const int CSS_FILTER_INVERT = 6;

  static const int CSS_FILTER_OPACITY = 7;

  static const int CSS_FILTER_REFERENCE = 1;

  static const int CSS_FILTER_SATURATE = 4;

  static const int CSS_FILTER_SEPIA = 3;

  @DomName('WebKitCSSFilterValue.operationType')
  @DocsEditable
  int get operationType native "WebKitCSSFilterValue_operationType_Getter";

}
// 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.


@DocsEditable
@DomName('WebKitCSSMixFunctionValue')
class WebKitCssMixFunctionValue extends _CssValueList {
  WebKitCssMixFunctionValue.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.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('WebKitNamedFlow')
class WebKitNamedFlow extends EventTarget {
  WebKitNamedFlow.internal() : super.internal();

  @DomName('WebKitNamedFlow.firstEmptyRegionIndex')
  @DocsEditable
  int get firstEmptyRegionIndex native "WebKitNamedFlow_firstEmptyRegionIndex_Getter";

  @DomName('WebKitNamedFlow.name')
  @DocsEditable
  String get name native "WebKitNamedFlow_name_Getter";

  @DomName('WebKitNamedFlow.overset')
  @DocsEditable
  bool get overset native "WebKitNamedFlow_overset_Getter";

  @DomName('WebKitNamedFlow.addEventListener')
  @DocsEditable
  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "WebKitNamedFlow_addEventListener_Callback";

  @DomName('WebKitNamedFlow.dispatchEvent')
  @DocsEditable
  bool dispatchEvent(Event event) native "WebKitNamedFlow_dispatchEvent_Callback";

  @DomName('WebKitNamedFlow.getContent')
  @DocsEditable
  List<Node> getContent() native "WebKitNamedFlow_getContent_Callback";

  @DomName('WebKitNamedFlow.getRegions')
  @DocsEditable
  List<Node> getRegions() native "WebKitNamedFlow_getRegions_Callback";

  @DomName('WebKitNamedFlow.getRegionsByContent')
  @DocsEditable
  List<Node> getRegionsByContent(Node contentNode) native "WebKitNamedFlow_getRegionsByContent_Callback";

  @DomName('WebKitNamedFlow.removeEventListener')
  @DocsEditable
  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "WebKitNamedFlow_removeEventListener_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
/**
 * Use the WebSocket interface to connect to a WebSocket,
 * and to send and receive data on that WebSocket.
 *
 * To use a WebSocket in your web app, first create a WebSocket object,
 * passing the WebSocket URL as an argument to the constructor.
 *
 *     var webSocket = new WebSocket('ws://127.0.0.1:1337/ws');
 *
 * To send data on the WebSocket, use the [send] method.
 *
 *     if (webSocket != null && webSocket.readyState == WebSocket.OPEN) {
 *       webSocket.send(data);
 *     } else {
 *       print('WebSocket not connected, message $data not sent');
 *     }
 *
 * To receive data on the WebSocket, register a listener for message events.
 *
 *     webSocket.on.message.add((MessageEvent e) {
 *       receivedData(e.data);
 *     });
 *
 * The message event handler receives a [MessageEvent] object
 * as its sole argument.
 * You can also define open, close, and error handlers,
 * as specified by [WebSocketEvents].
 *
 * For more information, see the
 * [WebSockets](http://www.dartlang.org/docs/library-tour/#html-websockets)
 * section of the library tour and
 * [Introducing WebSockets](http://www.html5rocks.com/en/tutorials/websockets/basics/),
 * an HTML5Rocks.com tutorial.
 */
@DomName('WebSocket')
@SupportedBrowser(SupportedBrowser.CHROME)
@SupportedBrowser(SupportedBrowser.FIREFOX)
@SupportedBrowser(SupportedBrowser.IE, '10')
@SupportedBrowser(SupportedBrowser.SAFARI)
class WebSocket extends EventTarget {
  WebSocket.internal() : super.internal();

  @DomName('WebSocket.closeEvent')
  @DocsEditable
  static const EventStreamProvider<CloseEvent> closeEvent = const EventStreamProvider<CloseEvent>('close');

  @DomName('WebSocket.errorEvent')
  @DocsEditable
  static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');

  @DomName('WebSocket.messageEvent')
  @DocsEditable
  static const EventStreamProvider<MessageEvent> messageEvent = const EventStreamProvider<MessageEvent>('message');

  @DomName('WebSocket.openEvent')
  @DocsEditable
  static const EventStreamProvider<Event> openEvent = const EventStreamProvider<Event>('open');

  @DomName('WebSocket.WebSocket')
  @DocsEditable
  factory WebSocket(String url, [protocol_OR_protocols]) {
    if ((url is String || url == null) && !?protocol_OR_protocols) {
      return WebSocket._create_1(url);
    }
    if ((url is String || url == null) && (protocol_OR_protocols is List<String> || protocol_OR_protocols == null)) {
      return WebSocket._create_2(url, protocol_OR_protocols);
    }
    if ((url is String || url == null) && (protocol_OR_protocols is String || protocol_OR_protocols == null)) {
      return WebSocket._create_3(url, protocol_OR_protocols);
    }
    throw new ArgumentError("Incorrect number or type of arguments");
  }

  @DocsEditable
  static WebSocket _create_1(url) native "WebSocket__create_1constructorCallback";

  @DocsEditable
  static WebSocket _create_2(url, protocol_OR_protocols) native "WebSocket__create_2constructorCallback";

  @DocsEditable
  static WebSocket _create_3(url, protocol_OR_protocols) native "WebSocket__create_3constructorCallback";

  /// Checks if this type is supported on the current platform.
  static bool get supported => true;

  static const int CLOSED = 3;

  static const int CLOSING = 2;

  static const int CONNECTING = 0;

  static const int OPEN = 1;

  @DomName('WebSocket.URL')
  @DocsEditable
  String get Url native "WebSocket_URL_Getter";

  @DomName('WebSocket.binaryType')
  @DocsEditable
  String get binaryType native "WebSocket_binaryType_Getter";

  @DomName('WebSocket.binaryType')
  @DocsEditable
  void set binaryType(String value) native "WebSocket_binaryType_Setter";

  @DomName('WebSocket.bufferedAmount')
  @DocsEditable
  int get bufferedAmount native "WebSocket_bufferedAmount_Getter";

  @DomName('WebSocket.extensions')
  @DocsEditable
  String get extensions native "WebSocket_extensions_Getter";

  @DomName('WebSocket.protocol')
  @DocsEditable
  String get protocol native "WebSocket_protocol_Getter";

  @DomName('WebSocket.readyState')
  @DocsEditable
  int get readyState native "WebSocket_readyState_Getter";

  @DomName('WebSocket.url')
  @DocsEditable
  String get url native "WebSocket_url_Getter";

  @DomName('WebSocket.addEventListener')
  @DocsEditable
  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "WebSocket_addEventListener_Callback";

  void close([int code, String reason]) {
    if (?reason) {
      _close_1(code, reason);
      return;
    }
    if (?code) {
      _close_2(code);
      return;
    }
    _close_3();
    return;
  }

  @DomName('WebSocket._close_1')
  @DocsEditable
  void _close_1(code, reason) native "WebSocket__close_1_Callback";

  @DomName('WebSocket._close_2')
  @DocsEditable
  void _close_2(code) native "WebSocket__close_2_Callback";

  @DomName('WebSocket._close_3')
  @DocsEditable
  void _close_3() native "WebSocket__close_3_Callback";

  @DomName('WebSocket.dispatchEvent')
  @DocsEditable
  bool dispatchEvent(Event evt) native "WebSocket_dispatchEvent_Callback";

  @DomName('WebSocket.removeEventListener')
  @DocsEditable
  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "WebSocket_removeEventListener_Callback";

  @DomName('WebSocket.send')
  @DocsEditable
  void send(data) native "WebSocket_send_Callback";

  @DomName('WebSocket.onclose')
  @DocsEditable
  Stream<CloseEvent> get onClose => closeEvent.forTarget(this);

  @DomName('WebSocket.onerror')
  @DocsEditable
  Stream<Event> get onError => errorEvent.forTarget(this);

  @DomName('WebSocket.onmessage')
  @DocsEditable
  Stream<MessageEvent> get onMessage => messageEvent.forTarget(this);

  @DomName('WebSocket.onopen')
  @DocsEditable
  Stream<Event> get onOpen => openEvent.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('WheelEvent')
class WheelEvent extends MouseEvent {

  factory WheelEvent(String type,
      {Window view, int deltaX: 0, int deltaY: 0,
      int detail: 0, int screenX: 0, int screenY: 0, int clientX: 0,
      int clientY: 0, int button: 0, bool canBubble: true,
      bool cancelable: true, bool ctrlKey: false, bool altKey: false,
      bool shiftKey: false, bool metaKey: false, EventTarget relatedTarget}) {

    if (view == null) {
      view = window;
    }
    var eventType = 'WheelEvent';
    if (Device.isFirefox) {
      eventType = 'MouseScrollEvents';
    }
    final event = document.$dom_createEvent(eventType);
      // Fallthrough for Dartium.
      event.$dom_initMouseEvent(type, canBubble, cancelable, view, detail,
          screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey,
          metaKey, button, relatedTarget);
      event.$dom_initWebKitWheelEvent(deltaX,
          deltaY ~/ 120, // Chrome does an auto-convert to pixels.
          view, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey,
          metaKey);

    return event;
  }

  WheelEvent.internal() : super.internal();

  static const int DOM_DELTA_LINE = 0x01;

  static const int DOM_DELTA_PAGE = 0x02;

  static const int DOM_DELTA_PIXEL = 0x00;

  @DomName('WheelEvent.deltaMode')
  @DocsEditable
  int get deltaMode native "WheelEvent_deltaMode_Getter";

  @DomName('WheelEvent.webkitDirectionInvertedFromDevice')
  @DocsEditable
  @SupportedBrowser(SupportedBrowser.CHROME)
  @SupportedBrowser(SupportedBrowser.SAFARI)
  @Experimental
  bool get directionInvertedFromDevice native "WheelEvent_webkitDirectionInvertedFromDevice_Getter";

  @DomName('WheelEvent.wheelDeltaX')
  @DocsEditable
  int get $dom_wheelDeltaX native "WheelEvent_wheelDeltaX_Getter";

  @DomName('WheelEvent.wheelDeltaY')
  @DocsEditable
  int get $dom_wheelDeltaY native "WheelEvent_wheelDeltaY_Getter";

  @DomName('WheelEvent.initWebKitWheelEvent')
  @DocsEditable
  void $dom_initWebKitWheelEvent(int wheelDeltaX, int wheelDeltaY, Window view, int screenX, int screenY, int clientX, int clientY, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey) native "WheelEvent_initWebKitWheelEvent_Callback";


  @DomName('WheelEvent.deltaX')
  num get deltaX => $dom_wheelDeltaX;
  @DomName('WheelEvent.deltaY')
  num get deltaY => $dom_wheelDeltaY;
}
// 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('Window')
class Window extends EventTarget implements WindowBase {

  /**
   * Executes a [callback] after the immediate execution stack has completed.
   *
   * This differs from using Timer.run(callback)
   * because Timer will run in about 4-15 milliseconds, depending on browser,
   * depending on load. [setImmediate], in contrast, makes browser-specific
   * changes in behavior to attempt to run immediately after the current
   * frame unwinds, causing the future to complete after all processing has
   * completed for the current event, but before any subsequent events.
   */
  void setImmediate(TimeoutHandler callback) {
    _addMicrotaskCallback(callback);
  }
  /**
   * Lookup a port by its [name].  Return null if no port is
   * registered under [name].
   */
  SendPortSync lookupPort(String name) {
    var portStr = document.documentElement.attributes['dart-port:$name'];
    if (portStr == null) {
      return null;
    }
    var port = json.parse(portStr);
    return _deserialize(port);
  }

  /**
   * Register a [port] on this window under the given [name].  This
   * port may be retrieved by any isolate (or JavaScript script)
   * running in this window.
   */
  void registerPort(String name, var port) {
    var serialized = _serialize(port);
    document.documentElement.attributes['dart-port:$name'] =
        json.stringify(serialized);
  }

  /**
   * 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.
   *
   * 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>();
    requestAnimationFrame((time) {
      completer.complete(time);
    });
    return completer.future;
  }

  /// Checks if _setImmediate is supported.
  static bool get _supportsSetImmediate => false;

  /// Dartium stub for IE's setImmediate.
  void _setImmediate(void callback()) {
    throw new UnsupportedError('setImmediate is not supported');
  }

  Window.internal() : super.internal();

  @DomName('DOMWindow.DOMContentLoadedEvent')
  @DocsEditable
  static const EventStreamProvider<Event> contentLoadedEvent = const EventStreamProvider<Event>('DOMContentLoaded');

  @DomName('DOMWindow.beforeunloadEvent')
  @DocsEditable
  static const EventStreamProvider<Event> beforeUnloadEvent = const EventStreamProvider<Event>('beforeunload');

  @DomName('DOMWindow.devicemotionEvent')
  @DocsEditable
  static const EventStreamProvider<DeviceMotionEvent> deviceMotionEvent = const EventStreamProvider<DeviceMotionEvent>('devicemotion');

  @DomName('DOMWindow.deviceorientationEvent')
  @DocsEditable
  static const EventStreamProvider<DeviceOrientationEvent> deviceOrientationEvent = const EventStreamProvider<DeviceOrientationEvent>('deviceorientation');

  @DomName('DOMWindow.hashchangeEvent')
  @DocsEditable
  static const EventStreamProvider<Event> hashChangeEvent = const EventStreamProvider<Event>('hashchange');

  @DomName('DOMWindow.messageEvent')
  @DocsEditable
  static const EventStreamProvider<MessageEvent> messageEvent = const EventStreamProvider<MessageEvent>('message');

  @DomName('DOMWindow.offlineEvent')
  @DocsEditable
  static const EventStreamProvider<Event> offlineEvent = const EventStreamProvider<Event>('offline');

  @DomName('DOMWindow.onlineEvent')
  @DocsEditable
  static const EventStreamProvider<Event> onlineEvent = const EventStreamProvider<Event>('online');

  @DomName('DOMWindow.pagehideEvent')
  @DocsEditable
  static const EventStreamProvider<Event> pageHideEvent = const EventStreamProvider<Event>('pagehide');

  @DomName('DOMWindow.pageshowEvent')
  @DocsEditable
  static const EventStreamProvider<Event> pageShowEvent = const EventStreamProvider<Event>('pageshow');

  @DomName('DOMWindow.popstateEvent')
  @DocsEditable
  static const EventStreamProvider<PopStateEvent> popStateEvent = const EventStreamProvider<PopStateEvent>('popstate');

  @DomName('DOMWindow.resizeEvent')
  @DocsEditable
  static const EventStreamProvider<Event> resizeEvent = const EventStreamProvider<Event>('resize');

  @DomName('DOMWindow.storageEvent')
  @DocsEditable
  static const EventStreamProvider<StorageEvent> storageEvent = const EventStreamProvider<StorageEvent>('storage');

  @DomName('DOMWindow.unloadEvent')
  @DocsEditable
  static const EventStreamProvider<Event> unloadEvent = const EventStreamProvider<Event>('unload');

  @DomName('DOMWindow.webkitAnimationEndEvent')
  @DocsEditable
  @SupportedBrowser(SupportedBrowser.CHROME)
  @SupportedBrowser(SupportedBrowser.SAFARI)
  @Experimental
  static const EventStreamProvider<AnimationEvent> animationEndEvent = const EventStreamProvider<AnimationEvent>('webkitAnimationEnd');

  @DomName('DOMWindow.webkitAnimationIterationEvent')
  @DocsEditable
  @SupportedBrowser(SupportedBrowser.CHROME)
  @SupportedBrowser(SupportedBrowser.SAFARI)
  @Experimental
  static const EventStreamProvider<AnimationEvent> animationIterationEvent = const EventStreamProvider<AnimationEvent>('webkitAnimationIteration');

  @DomName('DOMWindow.webkitAnimationStartEvent')
  @DocsEditable
  @SupportedBrowser(SupportedBrowser.CHROME)
  @SupportedBrowser(SupportedBrowser.SAFARI)
  @Experimental
  static const EventStreamProvider<AnimationEvent> animationStartEvent = const EventStreamProvider<AnimationEvent>('webkitAnimationStart');

  static const int PERSISTENT = 1;

  static const int TEMPORARY = 0;

  @DomName('DOMWindow.applicationCache')
  @DocsEditable
  ApplicationCache get applicationCache native "DOMWindow_applicationCache_Getter";

  @DomName('DOMWindow.closed')
  @DocsEditable
  bool get closed native "DOMWindow_closed_Getter";

  @DomName('DOMWindow.console')
  @DocsEditable
  Console get console native "DOMWindow_console_Getter";

  @DomName('DOMWindow.crypto')
  @DocsEditable
  Crypto get crypto native "DOMWindow_crypto_Getter";

  @DomName('DOMWindow.defaultStatus')
  @DocsEditable
  String get defaultStatus native "DOMWindow_defaultStatus_Getter";

  @DomName('DOMWindow.defaultStatus')
  @DocsEditable
  void set defaultStatus(String value) native "DOMWindow_defaultStatus_Setter";

  @DomName('DOMWindow.defaultstatus')
  @DocsEditable
  String get defaultstatus native "DOMWindow_defaultstatus_Getter";

  @DomName('DOMWindow.defaultstatus')
  @DocsEditable
  void set defaultstatus(String value) native "DOMWindow_defaultstatus_Setter";

  @DomName('DOMWindow.devicePixelRatio')
  @DocsEditable
  num get devicePixelRatio native "DOMWindow_devicePixelRatio_Getter";

  @DomName('DOMWindow.document')
  @DocsEditable
  Document get document native "DOMWindow_document_Getter";

  @DomName('DOMWindow.event')
  @DocsEditable
  Event get event native "DOMWindow_event_Getter";

  @DomName('DOMWindow.history')
  @DocsEditable
  History get history native "DOMWindow_history_Getter";

  @DomName('DOMWindow.indexedDB')
  @DocsEditable
  @SupportedBrowser(SupportedBrowser.CHROME)
  @SupportedBrowser(SupportedBrowser.FIREFOX, '15')
  @SupportedBrowser(SupportedBrowser.IE, '10')
  @Experimental
  IdbFactory get indexedDB native "DOMWindow_indexedDB_Getter";

  @DomName('DOMWindow.innerHeight')
  @DocsEditable
  int get innerHeight native "DOMWindow_innerHeight_Getter";

  @DomName('DOMWindow.innerWidth')
  @DocsEditable
  int get innerWidth native "DOMWindow_innerWidth_Getter";

  @DomName('DOMWindow.localStorage')
  @DocsEditable
  Storage get localStorage native "DOMWindow_localStorage_Getter";

  @DomName('DOMWindow.location')
  @DocsEditable
  Location get location native "DOMWindow_location_Getter";

  @DomName('DOMWindow.location')
  @DocsEditable
  void set location(Location value) native "DOMWindow_location_Setter";

  @DomName('DOMWindow.locationbar')
  @DocsEditable
  BarInfo get locationbar native "DOMWindow_locationbar_Getter";

  @DomName('DOMWindow.menubar')
  @DocsEditable
  BarInfo get menubar native "DOMWindow_menubar_Getter";

  @DomName('DOMWindow.name')
  @DocsEditable
  String get name native "DOMWindow_name_Getter";

  @DomName('DOMWindow.name')
  @DocsEditable
  void set name(String value) native "DOMWindow_name_Setter";

  @DomName('DOMWindow.navigator')
  @DocsEditable
  Navigator get navigator native "DOMWindow_navigator_Getter";

  @DomName('DOMWindow.offscreenBuffering')
  @DocsEditable
  bool get offscreenBuffering native "DOMWindow_offscreenBuffering_Getter";

  @DomName('DOMWindow.opener')
  @DocsEditable
  WindowBase get opener native "DOMWindow_opener_Getter";

  @DomName('DOMWindow.outerHeight')
  @DocsEditable
  int get outerHeight native "DOMWindow_outerHeight_Getter";

  @DomName('DOMWindow.outerWidth')
  @DocsEditable
  int get outerWidth native "DOMWindow_outerWidth_Getter";

  @DomName('DOMWindow.pagePopupController')
  @DocsEditable
  PagePopupController get pagePopupController native "DOMWindow_pagePopupController_Getter";

  @DomName('DOMWindow.pageXOffset')
  @DocsEditable
  int get pageXOffset native "DOMWindow_pageXOffset_Getter";

  @DomName('DOMWindow.pageYOffset')
  @DocsEditable
  int get pageYOffset native "DOMWindow_pageYOffset_Getter";

  @DomName('DOMWindow.parent')
  @DocsEditable
  WindowBase get parent native "DOMWindow_parent_Getter";

  @DomName('DOMWindow.performance')
  @DocsEditable
  @SupportedBrowser(SupportedBrowser.CHROME)
  @SupportedBrowser(SupportedBrowser.FIREFOX)
  @SupportedBrowser(SupportedBrowser.IE)
  Performance get performance native "DOMWindow_performance_Getter";

  @DomName('DOMWindow.personalbar')
  @DocsEditable
  BarInfo get personalbar native "DOMWindow_personalbar_Getter";

  @DomName('DOMWindow.screen')
  @DocsEditable
  Screen get screen native "DOMWindow_screen_Getter";

  @DomName('DOMWindow.screenLeft')
  @DocsEditable
  int get screenLeft native "DOMWindow_screenLeft_Getter";

  @DomName('DOMWindow.screenTop')
  @DocsEditable
  int get screenTop native "DOMWindow_screenTop_Getter";

  @DomName('DOMWindow.screenX')
  @DocsEditable
  int get screenX native "DOMWindow_screenX_Getter";

  @DomName('DOMWindow.screenY')
  @DocsEditable
  int get screenY native "DOMWindow_screenY_Getter";

  @DomName('DOMWindow.scrollX')
  @DocsEditable
  int get scrollX native "DOMWindow_scrollX_Getter";

  @DomName('DOMWindow.scrollY')
  @DocsEditable
  int get scrollY native "DOMWindow_scrollY_Getter";

  @DomName('DOMWindow.scrollbars')
  @DocsEditable
  BarInfo get scrollbars native "DOMWindow_scrollbars_Getter";

  @DomName('DOMWindow.self')
  @DocsEditable
  WindowBase get self native "DOMWindow_self_Getter";

  @DomName('DOMWindow.sessionStorage')
  @DocsEditable
  Storage get sessionStorage native "DOMWindow_sessionStorage_Getter";

  @DomName('DOMWindow.status')
  @DocsEditable
  String get status native "DOMWindow_status_Getter";

  @DomName('DOMWindow.status')
  @DocsEditable
  void set status(String value) native "DOMWindow_status_Setter";

  @DomName('DOMWindow.statusbar')
  @DocsEditable
  BarInfo get statusbar native "DOMWindow_statusbar_Getter";

  @DomName('DOMWindow.styleMedia')
  @DocsEditable
  StyleMedia get styleMedia native "DOMWindow_styleMedia_Getter";

  @DomName('DOMWindow.toolbar')
  @DocsEditable
  BarInfo get toolbar native "DOMWindow_toolbar_Getter";

  @DomName('DOMWindow.top')
  @DocsEditable
  WindowBase get top native "DOMWindow_top_Getter";

  @DomName('DOMWindow.webkitNotifications')
  @DocsEditable
  @SupportedBrowser(SupportedBrowser.CHROME)
  @SupportedBrowser(SupportedBrowser.SAFARI)
  @Experimental
  NotificationCenter get notifications native "DOMWindow_webkitNotifications_Getter";

  @DomName('DOMWindow.webkitStorageInfo')
  @DocsEditable
  @SupportedBrowser(SupportedBrowser.CHROME)
  @SupportedBrowser(SupportedBrowser.SAFARI)
  @Experimental
  StorageInfo get storageInfo native "DOMWindow_webkitStorageInfo_Getter";

  @DomName('DOMWindow.window')
  @DocsEditable
  WindowBase get window native "DOMWindow_window_Getter";

  @DomName('DOMWindow.addEventListener')
  @DocsEditable
  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "DOMWindow_addEventListener_Callback";

  @DomName('DOMWindow.alert')
  @DocsEditable
  void alert(String message) native "DOMWindow_alert_Callback";

  @DomName('DOMWindow.atob')
  @DocsEditable
  String atob(String string) native "DOMWindow_atob_Callback";

  @DomName('DOMWindow.btoa')
  @DocsEditable
  String btoa(String string) native "DOMWindow_btoa_Callback";

  @DomName('DOMWindow.cancelAnimationFrame')
  @DocsEditable
  void cancelAnimationFrame(int id) native "DOMWindow_cancelAnimationFrame_Callback";

  @DomName('DOMWindow.captureEvents')
  @DocsEditable
  void captureEvents() native "DOMWindow_captureEvents_Callback";

  @DomName('DOMWindow.clearInterval')
  @DocsEditable
  void _clearInterval(int handle) native "DOMWindow_clearInterval_Callback";

  @DomName('DOMWindow.clearTimeout')
  @DocsEditable
  void _clearTimeout(int handle) native "DOMWindow_clearTimeout_Callback";

  @DomName('DOMWindow.close')
  @DocsEditable
  void close() native "DOMWindow_close_Callback";

  @DomName('DOMWindow.confirm')
  @DocsEditable
  bool confirm(String message) native "DOMWindow_confirm_Callback";

  @DomName('DOMWindow.dispatchEvent')
  @DocsEditable
  bool dispatchEvent(Event evt) native "DOMWindow_dispatchEvent_Callback";

  @DomName('DOMWindow.find')
  @DocsEditable
  bool find(String string, bool caseSensitive, bool backwards, bool wrap, bool wholeWord, bool searchInFrames, bool showDialog) native "DOMWindow_find_Callback";

  @DomName('DOMWindow.getComputedStyle')
  @DocsEditable
  CssStyleDeclaration $dom_getComputedStyle(Element element, String pseudoElement) native "DOMWindow_getComputedStyle_Callback";

  @DomName('DOMWindow.getMatchedCSSRules')
  @DocsEditable
  List<CssRule> getMatchedCssRules(Element element, String pseudoElement) native "DOMWindow_getMatchedCSSRules_Callback";

  @DomName('DOMWindow.getSelection')
  @DocsEditable
  DomSelection getSelection() native "DOMWindow_getSelection_Callback";

  @DomName('DOMWindow.matchMedia')
  @DocsEditable
  MediaQueryList matchMedia(String query) native "DOMWindow_matchMedia_Callback";

  @DomName('DOMWindow.moveBy')
  @DocsEditable
  void moveBy(num x, num y) native "DOMWindow_moveBy_Callback";

  @DomName('DOMWindow.moveTo')
  @DocsEditable
  void moveTo(num x, num y) native "DOMWindow_moveTo_Callback";

  @DomName('DOMWindow.open')
  @DocsEditable
  WindowBase open(String url, String name, [String options]) native "DOMWindow_open_Callback";

  @DomName('DOMWindow.openDatabase')
  @DocsEditable
  @SupportedBrowser(SupportedBrowser.CHROME)
  @SupportedBrowser(SupportedBrowser.SAFARI)
  @Experimental
  SqlDatabase openDatabase(String name, String version, String displayName, int estimatedSize, [DatabaseCallback creationCallback]) native "DOMWindow_openDatabase_Callback";

  @DomName('DOMWindow.postMessage')
  @DocsEditable
  void postMessage(/*SerializedScriptValue*/ message, String targetOrigin, [List messagePorts]) native "DOMWindow_postMessage_Callback";

  @DomName('DOMWindow.print')
  @DocsEditable
  void print() native "DOMWindow_print_Callback";

  @DomName('DOMWindow.releaseEvents')
  @DocsEditable
  void releaseEvents() native "DOMWindow_releaseEvents_Callback";

  @DomName('DOMWindow.removeEventListener')
  @DocsEditable
  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "DOMWindow_removeEventListener_Callback";

  @DomName('DOMWindow.requestAnimationFrame')
  @DocsEditable
  int requestAnimationFrame(RequestAnimationFrameCallback callback) native "DOMWindow_requestAnimationFrame_Callback";

  @DomName('DOMWindow.resizeBy')
  @DocsEditable
  void resizeBy(num x, num y) native "DOMWindow_resizeBy_Callback";

  @DomName('DOMWindow.resizeTo')
  @DocsEditable
  void resizeTo(num width, num height) native "DOMWindow_resizeTo_Callback";

  @DomName('DOMWindow.scroll')
  @DocsEditable
  void scroll(int x, int y) native "DOMWindow_scroll_Callback";

  @DomName('DOMWindow.scrollBy')
  @DocsEditable
  void scrollBy(int x, int y) native "DOMWindow_scrollBy_Callback";

  @DomName('DOMWindow.scrollTo')
  @DocsEditable
  void scrollTo(int x, int y) native "DOMWindow_scrollTo_Callback";

  @DomName('DOMWindow.setInterval')
  @DocsEditable
  int _setInterval(Object handler, int timeout) native "DOMWindow_setInterval_Callback";

  @DomName('DOMWindow.setTimeout')
  @DocsEditable
  int _setTimeout(Object handler, int timeout) native "DOMWindow_setTimeout_Callback";

  @DomName('DOMWindow.showModalDialog')
  @DocsEditable
  Object showModalDialog(String url, [Object dialogArgs, String featureArgs]) native "DOMWindow_showModalDialog_Callback";

  @DomName('DOMWindow.stop')
  @DocsEditable
  void stop() native "DOMWindow_stop_Callback";

  @DomName('DOMWindow.webkitConvertPointFromNodeToPage')
  @DocsEditable
  @SupportedBrowser(SupportedBrowser.CHROME)
  @SupportedBrowser(SupportedBrowser.SAFARI)
  @Experimental
  DomPoint convertPointFromNodeToPage(Node node, DomPoint p) native "DOMWindow_webkitConvertPointFromNodeToPage_Callback";

  @DomName('DOMWindow.webkitConvertPointFromPageToNode')
  @DocsEditable
  @SupportedBrowser(SupportedBrowser.CHROME)
  @SupportedBrowser(SupportedBrowser.SAFARI)
  @Experimental
  DomPoint convertPointFromPageToNode(Node node, DomPoint p) native "DOMWindow_webkitConvertPointFromPageToNode_Callback";

  @DomName('DOMWindow.webkitRequestFileSystem')
  @DocsEditable
  @SupportedBrowser(SupportedBrowser.CHROME)
  @Experimental
  void _requestFileSystem(int type, int size, _FileSystemCallback successCallback, [_ErrorCallback errorCallback]) native "DOMWindow_webkitRequestFileSystem_Callback";

  Future<FileSystem> requestFileSystem(int type, int size) {
    var completer = new Completer<FileSystem>();
    _requestFileSystem(type, size,
        (value) { completer.complete(value); },
        (error) { completer.completeError(error); });
    return completer.future;
  }

  @DomName('DOMWindow.webkitResolveLocalFileSystemURL')
  @DocsEditable
  @SupportedBrowser(SupportedBrowser.CHROME)
  @Experimental
  void _resolveLocalFileSystemUrl(String url, _EntryCallback successCallback, [_ErrorCallback errorCallback]) native "DOMWindow_webkitResolveLocalFileSystemURL_Callback";

  Future<Entry> resolveLocalFileSystemUrl(String url) {
    var completer = new Completer<Entry>();
    _resolveLocalFileSystemUrl(url,
        (value) { completer.complete(value); },
        (error) { completer.completeError(error); });
    return completer.future;
  }

  @DomName('DOMWindow.onDOMContentLoaded')
  @DocsEditable
  Stream<Event> get onContentLoaded => contentLoadedEvent.forTarget(this);

  @DomName('DOMWindow.onabort')
  @DocsEditable
  Stream<Event> get onAbort => Element.abortEvent.forTarget(this);

  @DomName('DOMWindow.onbeforeunload')
  @DocsEditable
  Stream<Event> get onBeforeUnload => beforeUnloadEvent.forTarget(this);

  @DomName('DOMWindow.onblur')
  @DocsEditable
  Stream<Event> get onBlur => Element.blurEvent.forTarget(this);

  @DomName('DOMWindow.onchange')
  @DocsEditable
  Stream<Event> get onChange => Element.changeEvent.forTarget(this);

  @DomName('DOMWindow.onclick')
  @DocsEditable
  Stream<MouseEvent> get onClick => Element.clickEvent.forTarget(this);

  @DomName('DOMWindow.oncontextmenu')
  @DocsEditable
  Stream<MouseEvent> get onContextMenu => Element.contextMenuEvent.forTarget(this);

  @DomName('DOMWindow.ondblclick')
  @DocsEditable
  Stream<Event> get onDoubleClick => Element.doubleClickEvent.forTarget(this);

  @DomName('DOMWindow.ondevicemotion')
  @DocsEditable
  Stream<DeviceMotionEvent> get onDeviceMotion => deviceMotionEvent.forTarget(this);

  @DomName('DOMWindow.ondeviceorientation')
  @DocsEditable
  Stream<DeviceOrientationEvent> get onDeviceOrientation => deviceOrientationEvent.forTarget(this);

  @DomName('DOMWindow.ondrag')
  @DocsEditable
  Stream<MouseEvent> get onDrag => Element.dragEvent.forTarget(this);

  @DomName('DOMWindow.ondragend')
  @DocsEditable
  Stream<MouseEvent> get onDragEnd => Element.dragEndEvent.forTarget(this);

  @DomName('DOMWindow.ondragenter')
  @DocsEditable
  Stream<MouseEvent> get onDragEnter => Element.dragEnterEvent.forTarget(this);

  @DomName('DOMWindow.ondragleave')
  @DocsEditable
  Stream<MouseEvent> get onDragLeave => Element.dragLeaveEvent.forTarget(this);

  @DomName('DOMWindow.ondragover')
  @DocsEditable
  Stream<MouseEvent> get onDragOver => Element.dragOverEvent.forTarget(this);

  @DomName('DOMWindow.ondragstart')
  @DocsEditable
  Stream<MouseEvent> get onDragStart => Element.dragStartEvent.forTarget(this);

  @DomName('DOMWindow.ondrop')
  @DocsEditable
  Stream<MouseEvent> get onDrop => Element.dropEvent.forTarget(this);

  @DomName('DOMWindow.onerror')
  @DocsEditable
  Stream<Event> get onError => Element.errorEvent.forTarget(this);

  @DomName('DOMWindow.onfocus')
  @DocsEditable
  Stream<Event> get onFocus => Element.focusEvent.forTarget(this);

  @DomName('DOMWindow.onhashchange')
  @DocsEditable
  Stream<Event> get onHashChange => hashChangeEvent.forTarget(this);

  @DomName('DOMWindow.oninput')
  @DocsEditable
  Stream<Event> get onInput => Element.inputEvent.forTarget(this);

  @DomName('DOMWindow.oninvalid')
  @DocsEditable
  Stream<Event> get onInvalid => Element.invalidEvent.forTarget(this);

  @DomName('DOMWindow.onkeydown')
  @DocsEditable
  Stream<KeyboardEvent> get onKeyDown => Element.keyDownEvent.forTarget(this);

  @DomName('DOMWindow.onkeypress')
  @DocsEditable
  Stream<KeyboardEvent> get onKeyPress => Element.keyPressEvent.forTarget(this);

  @DomName('DOMWindow.onkeyup')
  @DocsEditable
  Stream<KeyboardEvent> get onKeyUp => Element.keyUpEvent.forTarget(this);

  @DomName('DOMWindow.onload')
  @DocsEditable
  Stream<Event> get onLoad => Element.loadEvent.forTarget(this);

  @DomName('DOMWindow.onmessage')
  @DocsEditable
  Stream<MessageEvent> get onMessage => messageEvent.forTarget(this);

  @DomName('DOMWindow.onmousedown')
  @DocsEditable
  Stream<MouseEvent> get onMouseDown => Element.mouseDownEvent.forTarget(this);

  @DomName('DOMWindow.onmousemove')
  @DocsEditable
  Stream<MouseEvent> get onMouseMove => Element.mouseMoveEvent.forTarget(this);

  @DomName('DOMWindow.onmouseout')
  @DocsEditable
  Stream<MouseEvent> get onMouseOut => Element.mouseOutEvent.forTarget(this);

  @DomName('DOMWindow.onmouseover')
  @DocsEditable
  Stream<MouseEvent> get onMouseOver => Element.mouseOverEvent.forTarget(this);

  @DomName('DOMWindow.onmouseup')
  @DocsEditable
  Stream<MouseEvent> get onMouseUp => Element.mouseUpEvent.forTarget(this);

  @DomName('DOMWindow.onmousewheel')
  @DocsEditable
  Stream<WheelEvent> get onMouseWheel => Element.mouseWheelEvent.forTarget(this);

  @DomName('DOMWindow.onoffline')
  @DocsEditable
  Stream<Event> get onOffline => offlineEvent.forTarget(this);

  @DomName('DOMWindow.ononline')
  @DocsEditable
  Stream<Event> get onOnline => onlineEvent.forTarget(this);

  @DomName('DOMWindow.onpagehide')
  @DocsEditable
  Stream<Event> get onPageHide => pageHideEvent.forTarget(this);

  @DomName('DOMWindow.onpageshow')
  @DocsEditable
  Stream<Event> get onPageShow => pageShowEvent.forTarget(this);

  @DomName('DOMWindow.onpopstate')
  @DocsEditable
  Stream<PopStateEvent> get onPopState => popStateEvent.forTarget(this);

  @DomName('DOMWindow.onreset')
  @DocsEditable
  Stream<Event> get onReset => Element.resetEvent.forTarget(this);

  @DomName('DOMWindow.onresize')
  @DocsEditable
  Stream<Event> get onResize => resizeEvent.forTarget(this);

  @DomName('DOMWindow.onscroll')
  @DocsEditable
  Stream<Event> get onScroll => Element.scrollEvent.forTarget(this);

  @DomName('DOMWindow.onsearch')
  @DocsEditable
  Stream<Event> get onSearch => Element.searchEvent.forTarget(this);

  @DomName('DOMWindow.onselect')
  @DocsEditable
  Stream<Event> get onSelect => Element.selectEvent.forTarget(this);

  @DomName('DOMWindow.onstorage')
  @DocsEditable
  Stream<StorageEvent> get onStorage => storageEvent.forTarget(this);

  @DomName('DOMWindow.onsubmit')
  @DocsEditable
  Stream<Event> get onSubmit => Element.submitEvent.forTarget(this);

  @DomName('DOMWindow.ontouchcancel')
  @DocsEditable
  Stream<TouchEvent> get onTouchCancel => Element.touchCancelEvent.forTarget(this);

  @DomName('DOMWindow.ontouchend')
  @DocsEditable
  Stream<TouchEvent> get onTouchEnd => Element.touchEndEvent.forTarget(this);

  @DomName('DOMWindow.ontouchmove')
  @DocsEditable
  Stream<TouchEvent> get onTouchMove => Element.touchMoveEvent.forTarget(this);

  @DomName('DOMWindow.ontouchstart')
  @DocsEditable
  Stream<TouchEvent> get onTouchStart => Element.touchStartEvent.forTarget(this);

  @DomName('DOMWindow.onunload')
  @DocsEditable
  Stream<Event> get onUnload => unloadEvent.forTarget(this);

  @DomName('DOMWindow.onwebkitAnimationEnd')
  @DocsEditable
  Stream<AnimationEvent> get onAnimationEnd => animationEndEvent.forTarget(this);

  @DomName('DOMWindow.onwebkitAnimationIteration')
  @DocsEditable
  Stream<AnimationEvent> get onAnimationIteration => animationIterationEvent.forTarget(this);

  @DomName('DOMWindow.onwebkitAnimationStart')
  @DocsEditable
  Stream<AnimationEvent> get onAnimationStart => animationStartEvent.forTarget(this);

  @DomName('DOMWindow.onwebkitTransitionEnd')
  @DocsEditable
  Stream<TransitionEvent> get onTransitionEnd => Element.transitionEndEvent.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.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('Worker')
class Worker extends AbstractWorker {
  Worker.internal() : super.internal();

  @DomName('Worker.messageEvent')
  @DocsEditable
  static const EventStreamProvider<MessageEvent> messageEvent = const EventStreamProvider<MessageEvent>('message');

  @DomName('Worker.Worker')
  @DocsEditable
  factory Worker(String scriptUrl) {
    return Worker._create_1(scriptUrl);
  }

  @DocsEditable
  static Worker _create_1(scriptUrl) native "Worker__create_1constructorCallback";

  @DomName('Worker.postMessage')
  @DocsEditable
  void postMessage(/*SerializedScriptValue*/ message, [List messagePorts]) native "Worker_postMessage_Callback";

  @DomName('Worker.terminate')
  @DocsEditable
  void terminate() native "Worker_terminate_Callback";

  @DomName('Worker.onmessage')
  @DocsEditable
  Stream<MessageEvent> get onMessage => messageEvent.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.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('WorkerContext')
class WorkerContext extends EventTarget {
  WorkerContext.internal() : super.internal();

  @DomName('WorkerContext.errorEvent')
  @DocsEditable
  static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');

  static const int PERSISTENT = 1;

  static const int TEMPORARY = 0;

  @DomName('WorkerContext.indexedDB')
  @DocsEditable
  @SupportedBrowser(SupportedBrowser.CHROME)
  @SupportedBrowser(SupportedBrowser.FIREFOX, '15')
  @SupportedBrowser(SupportedBrowser.IE, '10')
  @Experimental
  IdbFactory get indexedDB native "WorkerContext_indexedDB_Getter";

  @DomName('WorkerContext.location')
  @DocsEditable
  WorkerLocation get location native "WorkerContext_location_Getter";

  @DomName('WorkerContext.navigator')
  @DocsEditable
  WorkerNavigator get navigator native "WorkerContext_navigator_Getter";

  @DomName('WorkerContext.self')
  @DocsEditable
  WorkerContext get self native "WorkerContext_self_Getter";

  @DomName('WorkerContext.webkitNotifications')
  @DocsEditable
  @SupportedBrowser(SupportedBrowser.CHROME)
  @SupportedBrowser(SupportedBrowser.SAFARI)
  @Experimental
  NotificationCenter get notifications native "WorkerContext_webkitNotifications_Getter";

  @DomName('WorkerContext.addEventListener')
  @DocsEditable
  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "WorkerContext_addEventListener_Callback";

  @DomName('WorkerContext.clearInterval')
  @DocsEditable
  void clearInterval(int handle) native "WorkerContext_clearInterval_Callback";

  @DomName('WorkerContext.clearTimeout')
  @DocsEditable
  void clearTimeout(int handle) native "WorkerContext_clearTimeout_Callback";

  @DomName('WorkerContext.close')
  @DocsEditable
  void close() native "WorkerContext_close_Callback";

  @DomName('WorkerContext.dispatchEvent')
  @DocsEditable
  bool dispatchEvent(Event evt) native "WorkerContext_dispatchEvent_Callback";

  @DomName('WorkerContext.importScripts')
  @DocsEditable
  void importScripts() native "WorkerContext_importScripts_Callback";

  @DomName('WorkerContext.openDatabase')
  @DocsEditable
  @SupportedBrowser(SupportedBrowser.CHROME)
  @SupportedBrowser(SupportedBrowser.SAFARI)
  @Experimental
  SqlDatabase openDatabase(String name, String version, String displayName, int estimatedSize, [DatabaseCallback creationCallback]) native "WorkerContext_openDatabase_Callback";

  @DomName('WorkerContext.openDatabaseSync')
  @DocsEditable
  @SupportedBrowser(SupportedBrowser.CHROME)
  @SupportedBrowser(SupportedBrowser.SAFARI)
  @Experimental
  SqlDatabaseSync openDatabaseSync(String name, String version, String displayName, int estimatedSize, [DatabaseCallback creationCallback]) native "WorkerContext_openDatabaseSync_Callback";

  @DomName('WorkerContext.removeEventListener')
  @DocsEditable
  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "WorkerContext_removeEventListener_Callback";

  @DomName('WorkerContext.setInterval')
  @DocsEditable
  int setInterval(Object handler, int timeout) native "WorkerContext_setInterval_Callback";

  @DomName('WorkerContext.setTimeout')
  @DocsEditable
  int setTimeout(Object handler, int timeout) native "WorkerContext_setTimeout_Callback";

  @DomName('WorkerContext.webkitRequestFileSystem')
  @DocsEditable
  @SupportedBrowser(SupportedBrowser.CHROME)
  @Experimental
  void _requestFileSystem(int type, int size, [_FileSystemCallback successCallback, _ErrorCallback errorCallback]) native "WorkerContext_webkitRequestFileSystem_Callback";

  Future<FileSystem> requestFileSystem(int type, int size) {
    var completer = new Completer<FileSystem>();
    _requestFileSystem(type, size,
        (value) { completer.complete(value); },
        (error) { completer.completeError(error); });
    return completer.future;
  }

  @DomName('WorkerContext.webkitRequestFileSystemSync')
  @DocsEditable
  @SupportedBrowser(SupportedBrowser.CHROME)
  @Experimental
  FileSystemSync requestFileSystemSync(int type, int size) native "WorkerContext_webkitRequestFileSystemSync_Callback";

  @DomName('WorkerContext.webkitResolveLocalFileSystemSyncURL')
  @DocsEditable
  @SupportedBrowser(SupportedBrowser.CHROME)
  @Experimental
  EntrySync resolveLocalFileSystemSyncUrl(String url) native "WorkerContext_webkitResolveLocalFileSystemSyncURL_Callback";

  @DomName('WorkerContext.webkitResolveLocalFileSystemURL')
  @DocsEditable
  @SupportedBrowser(SupportedBrowser.CHROME)
  @Experimental
  void _resolveLocalFileSystemUrl(String url, _EntryCallback successCallback, [_ErrorCallback errorCallback]) native "WorkerContext_webkitResolveLocalFileSystemURL_Callback";

  Future<Entry> resolveLocalFileSystemUrl(String url) {
    var completer = new Completer<Entry>();
    _resolveLocalFileSystemUrl(url,
        (value) { completer.complete(value); },
        (error) { completer.completeError(error); });
    return completer.future;
  }

  @DomName('WorkerContext.onerror')
  @DocsEditable
  Stream<Event> get onError => errorEvent.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.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('WorkerLocation')
class WorkerLocation extends NativeFieldWrapperClass1 {
  WorkerLocation.internal();

  @DomName('WorkerLocation.hash')
  @DocsEditable
  String get hash native "WorkerLocation_hash_Getter";

  @DomName('WorkerLocation.host')
  @DocsEditable
  String get host native "WorkerLocation_host_Getter";

  @DomName('WorkerLocation.hostname')
  @DocsEditable
  String get hostname native "WorkerLocation_hostname_Getter";

  @DomName('WorkerLocation.href')
  @DocsEditable
  String get href native "WorkerLocation_href_Getter";

  @DomName('WorkerLocation.pathname')
  @DocsEditable
  String get pathname native "WorkerLocation_pathname_Getter";

  @DomName('WorkerLocation.port')
  @DocsEditable
  String get port native "WorkerLocation_port_Getter";

  @DomName('WorkerLocation.protocol')
  @DocsEditable
  String get protocol native "WorkerLocation_protocol_Getter";

  @DomName('WorkerLocation.search')
  @DocsEditable
  String get search native "WorkerLocation_search_Getter";

  @DomName('WorkerLocation.toString')
  @DocsEditable
  String toString() native "WorkerLocation_toString_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('WorkerNavigator')
class WorkerNavigator extends NativeFieldWrapperClass1 {
  WorkerNavigator.internal();

  @DomName('WorkerNavigator.appName')
  @DocsEditable
  String get appName native "WorkerNavigator_appName_Getter";

  @DomName('WorkerNavigator.appVersion')
  @DocsEditable
  String get appVersion native "WorkerNavigator_appVersion_Getter";

  @DomName('WorkerNavigator.onLine')
  @DocsEditable
  bool get onLine native "WorkerNavigator_onLine_Getter";

  @DomName('WorkerNavigator.platform')
  @DocsEditable
  String get platform native "WorkerNavigator_platform_Getter";

  @DomName('WorkerNavigator.userAgent')
  @DocsEditable
  String get userAgent native "WorkerNavigator_userAgent_Getter";

}
// 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.


@DocsEditable
@DomName('XPathEvaluator')
class XPathEvaluator extends NativeFieldWrapperClass1 {
  XPathEvaluator.internal();

  @DomName('XPathEvaluator.XPathEvaluator')
  @DocsEditable
  factory XPathEvaluator() {
    return XPathEvaluator._create_1();
  }

  @DocsEditable
  static XPathEvaluator _create_1() native "XPathEvaluator__create_1constructorCallback";

  @DomName('XPathEvaluator.createExpression')
  @DocsEditable
  XPathExpression createExpression(String expression, XPathNSResolver resolver) native "XPathEvaluator_createExpression_Callback";

  @DomName('XPathEvaluator.createNSResolver')
  @DocsEditable
  XPathNSResolver createNSResolver(Node nodeResolver) native "XPathEvaluator_createNSResolver_Callback";

  @DomName('XPathEvaluator.evaluate')
  @DocsEditable
  XPathResult evaluate(String expression, Node contextNode, XPathNSResolver resolver, int type, XPathResult inResult) native "XPathEvaluator_evaluate_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('XPathException')
class XPathException extends NativeFieldWrapperClass1 {
  XPathException.internal();

  static const int INVALID_EXPRESSION_ERR = 51;

  static const int TYPE_ERR = 52;

  @DomName('XPathException.code')
  @DocsEditable
  int get code native "XPathException_code_Getter";

  @DomName('XPathException.message')
  @DocsEditable
  String get message native "XPathException_message_Getter";

  @DomName('XPathException.name')
  @DocsEditable
  String get name native "XPathException_name_Getter";

  @DomName('XPathException.toString')
  @DocsEditable
  String toString() native "XPathException_toString_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('XPathExpression')
class XPathExpression extends NativeFieldWrapperClass1 {
  XPathExpression.internal();

  @DomName('XPathExpression.evaluate')
  @DocsEditable
  XPathResult evaluate(Node contextNode, int type, XPathResult inResult) native "XPathExpression_evaluate_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('XPathNSResolver')
class XPathNSResolver extends NativeFieldWrapperClass1 {
  XPathNSResolver.internal();

  @DomName('XPathNSResolver.lookupNamespaceURI')
  @DocsEditable
  String lookupNamespaceUri(String prefix) native "XPathNSResolver_lookupNamespaceURI_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('XPathResult')
class XPathResult extends NativeFieldWrapperClass1 {
  XPathResult.internal();

  static const int ANY_TYPE = 0;

  static const int ANY_UNORDERED_NODE_TYPE = 8;

  static const int BOOLEAN_TYPE = 3;

  static const int FIRST_ORDERED_NODE_TYPE = 9;

  static const int NUMBER_TYPE = 1;

  static const int ORDERED_NODE_ITERATOR_TYPE = 5;

  static const int ORDERED_NODE_SNAPSHOT_TYPE = 7;

  static const int STRING_TYPE = 2;

  static const int UNORDERED_NODE_ITERATOR_TYPE = 4;

  static const int UNORDERED_NODE_SNAPSHOT_TYPE = 6;

  @DomName('XPathResult.booleanValue')
  @DocsEditable
  bool get booleanValue native "XPathResult_booleanValue_Getter";

  @DomName('XPathResult.invalidIteratorState')
  @DocsEditable
  bool get invalidIteratorState native "XPathResult_invalidIteratorState_Getter";

  @DomName('XPathResult.numberValue')
  @DocsEditable
  num get numberValue native "XPathResult_numberValue_Getter";

  @DomName('XPathResult.resultType')
  @DocsEditable
  int get resultType native "XPathResult_resultType_Getter";

  @DomName('XPathResult.singleNodeValue')
  @DocsEditable
  Node get singleNodeValue native "XPathResult_singleNodeValue_Getter";

  @DomName('XPathResult.snapshotLength')
  @DocsEditable
  int get snapshotLength native "XPathResult_snapshotLength_Getter";

  @DomName('XPathResult.stringValue')
  @DocsEditable
  String get stringValue native "XPathResult_stringValue_Getter";

  @DomName('XPathResult.iterateNext')
  @DocsEditable
  Node iterateNext() native "XPathResult_iterateNext_Callback";

  @DomName('XPathResult.snapshotItem')
  @DocsEditable
  Node snapshotItem(int index) native "XPathResult_snapshotItem_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('XMLSerializer')
class XmlSerializer extends NativeFieldWrapperClass1 {
  XmlSerializer.internal();

  @DomName('XMLSerializer.XMLSerializer')
  @DocsEditable
  factory XmlSerializer() {
    return XmlSerializer._create_1();
  }

  @DocsEditable
  static XmlSerializer _create_1() native "XMLSerializer__create_1constructorCallback";

  @DomName('XMLSerializer.serializeToString')
  @DocsEditable
  String serializeToString(Node node) native "XMLSerializer_serializeToString_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('XSLTProcessor')
@SupportedBrowser(SupportedBrowser.CHROME)
@SupportedBrowser(SupportedBrowser.FIREFOX)
@SupportedBrowser(SupportedBrowser.SAFARI)
class XsltProcessor extends NativeFieldWrapperClass1 {
  XsltProcessor.internal();

  @DomName('XSLTProcessor.XSLTProcessor')
  @DocsEditable
  factory XsltProcessor() {
    return XsltProcessor._create_1();
  }

  @DocsEditable
  static XsltProcessor _create_1() native "XSLTProcessor__create_1constructorCallback";

  /// Checks if this type is supported on the current platform.
  static bool get supported => true;

  @DomName('XSLTProcessor.clearParameters')
  @DocsEditable
  void clearParameters() native "XSLTProcessor_clearParameters_Callback";

  @DomName('XSLTProcessor.getParameter')
  @DocsEditable
  String getParameter(String namespaceURI, String localName) native "XSLTProcessor_getParameter_Callback";

  @DomName('XSLTProcessor.importStylesheet')
  @DocsEditable
  void importStylesheet(Node stylesheet) native "XSLTProcessor_importStylesheet_Callback";

  @DomName('XSLTProcessor.removeParameter')
  @DocsEditable
  void removeParameter(String namespaceURI, String localName) native "XSLTProcessor_removeParameter_Callback";

  @DomName('XSLTProcessor.reset')
  @DocsEditable
  void reset() native "XSLTProcessor_reset_Callback";

  @DomName('XSLTProcessor.setParameter')
  @DocsEditable
  void setParameter(String namespaceURI, String localName, String value) native "XSLTProcessor_setParameter_Callback";

  @DomName('XSLTProcessor.transformToDocument')
  @DocsEditable
  Document transformToDocument(Node source) native "XSLTProcessor_transformToDocument_Callback";

  @DomName('XSLTProcessor.transformToFragment')
  @DocsEditable
  DocumentFragment transformToFragment(Node source, Document docVal) native "XSLTProcessor_transformToFragment_Callback";

}
// 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')
class _ClientRect extends NativeFieldWrapperClass1 implements Rect {

  // NOTE! All code below should be common with Rect.
  // TODO(blois): implement with mixins when available.

  String toString() {
    return '($left, $top, $width, $height)';
  }

  bool operator ==(other) {
    if (other is !Rect) return false;
    return left == other.left && top == other.top && width == other.width &&
        height == other.height;
  }

  /**
   * Computes the intersection of this rectangle and the rectangle parameter.
   * Returns null if there is no intersection.
   */
  Rect intersection(Rect rect) {
    var x0 = max(left, rect.left);
    var x1 = min(left + width, rect.left + rect.width);

    if (x0 <= x1) {
      var y0 = max(top, rect.top);
      var y1 = min(top + height, rect.top + rect.height);

      if (y0 <= y1) {
        return new Rect(x0, y0, x1 - x0, y1 - y0);
      }
    }
    return null;
  }


  /**
   * Returns whether a rectangle intersects this rectangle.
   */
  bool intersects(Rect 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 rectangle and the
   * input rectangle.
   */
  Rect union(Rect rect) {
    var right = max(this.left + this.width, rect.left + rect.width);
    var bottom = max(this.top + this.height, rect.top + rect.height);

    var left = min(this.left, rect.left);
    var top = min(this.top, rect.top);

    return new Rect(left, top, right - left, bottom - top);
  }

  /**
   * Tests whether this rectangle entirely contains another rectangle.
   */
  bool containsRect(Rect another) {
    return left <= another.left &&
           left + width >= another.left + another.width &&
           top <= another.top &&
           top + height >= another.top + another.height;
  }

  /**
   * Tests whether this rectangle entirely contains a point.
   */
  bool containsPoint(Point another) {
    return another.x >= left &&
           another.x <= left + width &&
           another.y >= top &&
           another.y <= top + height;
  }

  Rect ceil() => new Rect(left.ceil(), top.ceil(), width.ceil(), height.ceil());
  Rect floor() => new Rect(left.floor(), top.floor(), width.floor(),
      height.floor());
  Rect round() => new Rect(left.round(), top.round(), width.round(),
      height.round());

  /**
   * Truncates coordinates to integers and returns the result as a new
   * rectangle.
   */
  Rect toInt() => new Rect(left.toInt(), top.toInt(), width.toInt(),
      height.toInt());

  Point get topLeft => new Point(this.left, this.top);
  Point get bottomRight => new Point(this.left + this.width,
      this.top + this.height);
  _ClientRect.internal();

  @DomName('ClientRect.bottom')
  @DocsEditable
  num get bottom native "ClientRect_bottom_Getter";

  @DomName('ClientRect.height')
  @DocsEditable
  num get height native "ClientRect_height_Getter";

  @DomName('ClientRect.left')
  @DocsEditable
  num get left native "ClientRect_left_Getter";

  @DomName('ClientRect.right')
  @DocsEditable
  num get right native "ClientRect_right_Getter";

  @DomName('ClientRect.top')
  @DocsEditable
  num get top native "ClientRect_top_Getter";

  @DomName('ClientRect.width')
  @DocsEditable
  num get width native "ClientRect_width_Getter";
}
// 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.


@DocsEditable
@DomName('ClientRectList')
class _ClientRectList extends NativeFieldWrapperClass1 implements List<Rect> {
  _ClientRectList.internal();

  @DomName('ClientRectList.length')
  @DocsEditable
  int get length native "ClientRectList_length_Getter";

  Rect operator[](int index) native "ClientRectList_item_Callback";

  void operator[]=(int index, Rect value) {
    throw new UnsupportedError("Cannot assign element of immutable List.");
  }
  // -- start List<Rect> mixins.
  // Rect is the element type.

  // From Iterable<Rect>:

  Iterator<Rect> 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<Rect>(this);
  }

  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, Rect)) {
    return IterableMixinWorkaround.reduce(this, initialValue, combine);
  }

  bool contains(Rect element) => IterableMixinWorkaround.contains(this, element);

  void forEach(void f(Rect element)) => IterableMixinWorkaround.forEach(this, f);

  String join([String separator]) =>
      IterableMixinWorkaround.joinList(this, separator);

  Iterable map(f(Rect element)) =>
      IterableMixinWorkaround.mapList(this, f);

  Iterable<Rect> where(bool f(Rect element)) =>
      IterableMixinWorkaround.where(this, f);

  Iterable expand(Iterable f(Rect element)) =>
      IterableMixinWorkaround.expand(this, f);

  bool every(bool f(Rect element)) => IterableMixinWorkaround.every(this, f);

  bool any(bool f(Rect element)) => IterableMixinWorkaround.any(this, f);

  List<Rect> toList({ bool growable: true }) =>
      new List<Rect>.from(this, growable: growable);

  Set<Rect> toSet() => new Set<Rect>.from(this);

  bool get isEmpty => this.length == 0;

  Iterable<Rect> take(int n) => IterableMixinWorkaround.takeList(this, n);

  Iterable<Rect> takeWhile(bool test(Rect value)) {
    return IterableMixinWorkaround.takeWhile(this, test);
  }

  Iterable<Rect> skip(int n) => IterableMixinWorkaround.skipList(this, n);

  Iterable<Rect> skipWhile(bool test(Rect value)) {
    return IterableMixinWorkaround.skipWhile(this, test);
  }

  Rect firstWhere(bool test(Rect value), { Rect orElse() }) {
    return IterableMixinWorkaround.firstWhere(this, test, orElse);
  }

  Rect lastWhere(bool test(Rect value), {Rect orElse()}) {
    return IterableMixinWorkaround.lastWhereList(this, test, orElse);
  }

  Rect singleWhere(bool test(Rect value)) {
    return IterableMixinWorkaround.singleWhere(this, test);
  }

  Rect elementAt(int index) {
    return this[index];
  }

  // From Collection<Rect>:

  void add(Rect value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(Rect value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Iterable<Rect> iterable) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  // From List<Rect>:
  void set length(int value) {
    throw new UnsupportedError("Cannot resize immutable List.");
  }

  void clear() {
    throw new UnsupportedError("Cannot clear immutable List.");
  }

  Iterable<Rect> get reversed {
    return IterableMixinWorkaround.reversedList(this);
  }

  void sort([int compare(Rect a, Rect b)]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(Rect element, [int start = 0]) =>
      Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(Rect element, [int start]) {
    if (start == null) start = length - 1;
    return Lists.lastIndexOf(this, element, start);
  }

  Rect get first {
    if (this.length > 0) return this[0];
    throw new StateError("No elements");
  }

  Rect get last {
    if (this.length > 0) return this[this.length - 1];
    throw new StateError("No elements");
  }

  Rect get single {
    if (length == 1) return this[0];
    if (length == 0) throw new StateError("No elements");
    throw new StateError("More than one element");
  }

  Rect min([int compare(Rect a, Rect b)]) =>
      IterableMixinWorkaround.min(this, compare);

  Rect max([int compare(Rect a, Rect b)]) =>
      IterableMixinWorkaround.max(this, compare);

  void insert(int index, Rect element) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  Rect removeAt(int pos) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  Rect removeLast() {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void remove(Object object) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void removeAll(Iterable elements) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void retainAll(Iterable elements) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void removeWhere(bool test(Rect element)) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void retainWhere(bool test(Rect element)) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void setRange(int start, int rangeLength, List<Rect> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [Rect initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<Rect> sublist(int start, [int end]) {
    if (end == null) end = length;
    return Lists.getRange(this, start, end, <Rect>[]);
  }

  List<Rect> getRange(int start, int rangeLength) =>
      sublist(start, start + rangeLength);

  Map<int, Rect> asMap() =>
    IterableMixinWorkaround.asMapList(this);

  // -- end List<Rect> mixins.

  @DomName('ClientRectList.item')
  @DocsEditable
  Rect item(int index) native "ClientRectList_item_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('CSSRuleList')
class _CssRuleList extends NativeFieldWrapperClass1 implements List<CssRule> {
  _CssRuleList.internal();

  @DomName('CSSRuleList.length')
  @DocsEditable
  int get length native "CSSRuleList_length_Getter";

  CssRule operator[](int index) native "CSSRuleList_item_Callback";

  void operator[]=(int index, CssRule value) {
    throw new UnsupportedError("Cannot assign element of immutable List.");
  }
  // -- start List<CssRule> mixins.
  // CssRule is the element type.

  // From Iterable<CssRule>:

  Iterator<CssRule> 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<CssRule>(this);
  }

  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, CssRule)) {
    return IterableMixinWorkaround.reduce(this, initialValue, combine);
  }

  bool contains(CssRule element) => IterableMixinWorkaround.contains(this, element);

  void forEach(void f(CssRule element)) => IterableMixinWorkaround.forEach(this, f);

  String join([String separator]) =>
      IterableMixinWorkaround.joinList(this, separator);

  Iterable map(f(CssRule element)) =>
      IterableMixinWorkaround.mapList(this, f);

  Iterable<CssRule> where(bool f(CssRule element)) =>
      IterableMixinWorkaround.where(this, f);

  Iterable expand(Iterable f(CssRule element)) =>
      IterableMixinWorkaround.expand(this, f);

  bool every(bool f(CssRule element)) => IterableMixinWorkaround.every(this, f);

  bool any(bool f(CssRule element)) => IterableMixinWorkaround.any(this, f);

  List<CssRule> toList({ bool growable: true }) =>
      new List<CssRule>.from(this, growable: growable);

  Set<CssRule> toSet() => new Set<CssRule>.from(this);

  bool get isEmpty => this.length == 0;

  Iterable<CssRule> take(int n) => IterableMixinWorkaround.takeList(this, n);

  Iterable<CssRule> takeWhile(bool test(CssRule value)) {
    return IterableMixinWorkaround.takeWhile(this, test);
  }

  Iterable<CssRule> skip(int n) => IterableMixinWorkaround.skipList(this, n);

  Iterable<CssRule> skipWhile(bool test(CssRule value)) {
    return IterableMixinWorkaround.skipWhile(this, test);
  }

  CssRule firstWhere(bool test(CssRule value), { CssRule orElse() }) {
    return IterableMixinWorkaround.firstWhere(this, test, orElse);
  }

  CssRule lastWhere(bool test(CssRule value), {CssRule orElse()}) {
    return IterableMixinWorkaround.lastWhereList(this, test, orElse);
  }

  CssRule singleWhere(bool test(CssRule value)) {
    return IterableMixinWorkaround.singleWhere(this, test);
  }

  CssRule elementAt(int index) {
    return this[index];
  }

  // From Collection<CssRule>:

  void add(CssRule value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(CssRule value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Iterable<CssRule> iterable) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  // From List<CssRule>:
  void set length(int value) {
    throw new UnsupportedError("Cannot resize immutable List.");
  }

  void clear() {
    throw new UnsupportedError("Cannot clear immutable List.");
  }

  Iterable<CssRule> get reversed {
    return IterableMixinWorkaround.reversedList(this);
  }

  void sort([int compare(CssRule a, CssRule b)]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(CssRule element, [int start = 0]) =>
      Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(CssRule element, [int start]) {
    if (start == null) start = length - 1;
    return Lists.lastIndexOf(this, element, start);
  }

  CssRule get first {
    if (this.length > 0) return this[0];
    throw new StateError("No elements");
  }

  CssRule get last {
    if (this.length > 0) return this[this.length - 1];
    throw new StateError("No elements");
  }

  CssRule get single {
    if (length == 1) return this[0];
    if (length == 0) throw new StateError("No elements");
    throw new StateError("More than one element");
  }

  CssRule min([int compare(CssRule a, CssRule b)]) =>
      IterableMixinWorkaround.min(this, compare);

  CssRule max([int compare(CssRule a, CssRule b)]) =>
      IterableMixinWorkaround.max(this, compare);

  void insert(int index, CssRule element) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  CssRule removeAt(int pos) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  CssRule removeLast() {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void remove(Object object) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void removeAll(Iterable elements) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void retainAll(Iterable elements) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void removeWhere(bool test(CssRule element)) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void retainWhere(bool test(CssRule element)) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void setRange(int start, int rangeLength, List<CssRule> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [CssRule initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<CssRule> sublist(int start, [int end]) {
    if (end == null) end = length;
    return Lists.getRange(this, start, end, <CssRule>[]);
  }

  List<CssRule> getRange(int start, int rangeLength) =>
      sublist(start, start + rangeLength);

  Map<int, CssRule> asMap() =>
    IterableMixinWorkaround.asMapList(this);

  // -- end List<CssRule> mixins.

  @DomName('CSSRuleList.item')
  @DocsEditable
  CssRule item(int index) native "CSSRuleList_item_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('CSSValueList')
class _CssValueList extends CssValue implements List<CssValue> {
  _CssValueList.internal() : super.internal();

  @DomName('CSSValueList.length')
  @DocsEditable
  int get length native "CSSValueList_length_Getter";

  CssValue operator[](int index) native "CSSValueList_item_Callback";

  void operator[]=(int index, CssValue value) {
    throw new UnsupportedError("Cannot assign element of immutable List.");
  }
  // -- start List<CssValue> mixins.
  // CssValue is the element type.

  // From Iterable<CssValue>:

  Iterator<CssValue> 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<CssValue>(this);
  }

  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, CssValue)) {
    return IterableMixinWorkaround.reduce(this, initialValue, combine);
  }

  bool contains(CssValue element) => IterableMixinWorkaround.contains(this, element);

  void forEach(void f(CssValue element)) => IterableMixinWorkaround.forEach(this, f);

  String join([String separator]) =>
      IterableMixinWorkaround.joinList(this, separator);

  Iterable map(f(CssValue element)) =>
      IterableMixinWorkaround.mapList(this, f);

  Iterable<CssValue> where(bool f(CssValue element)) =>
      IterableMixinWorkaround.where(this, f);

  Iterable expand(Iterable f(CssValue element)) =>
      IterableMixinWorkaround.expand(this, f);

  bool every(bool f(CssValue element)) => IterableMixinWorkaround.every(this, f);

  bool any(bool f(CssValue element)) => IterableMixinWorkaround.any(this, f);

  List<CssValue> toList({ bool growable: true }) =>
      new List<CssValue>.from(this, growable: growable);

  Set<CssValue> toSet() => new Set<CssValue>.from(this);

  bool get isEmpty => this.length == 0;

  Iterable<CssValue> take(int n) => IterableMixinWorkaround.takeList(this, n);

  Iterable<CssValue> takeWhile(bool test(CssValue value)) {
    return IterableMixinWorkaround.takeWhile(this, test);
  }

  Iterable<CssValue> skip(int n) => IterableMixinWorkaround.skipList(this, n);

  Iterable<CssValue> skipWhile(bool test(CssValue value)) {
    return IterableMixinWorkaround.skipWhile(this, test);
  }

  CssValue firstWhere(bool test(CssValue value), { CssValue orElse() }) {
    return IterableMixinWorkaround.firstWhere(this, test, orElse);
  }

  CssValue lastWhere(bool test(CssValue value), {CssValue orElse()}) {
    return IterableMixinWorkaround.lastWhereList(this, test, orElse);
  }

  CssValue singleWhere(bool test(CssValue value)) {
    return IterableMixinWorkaround.singleWhere(this, test);
  }

  CssValue elementAt(int index) {
    return this[index];
  }

  // From Collection<CssValue>:

  void add(CssValue value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(CssValue value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Iterable<CssValue> iterable) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  // From List<CssValue>:
  void set length(int value) {
    throw new UnsupportedError("Cannot resize immutable List.");
  }

  void clear() {
    throw new UnsupportedError("Cannot clear immutable List.");
  }

  Iterable<CssValue> get reversed {
    return IterableMixinWorkaround.reversedList(this);
  }

  void sort([int compare(CssValue a, CssValue b)]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(CssValue element, [int start = 0]) =>
      Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(CssValue element, [int start]) {
    if (start == null) start = length - 1;
    return Lists.lastIndexOf(this, element, start);
  }

  CssValue get first {
    if (this.length > 0) return this[0];
    throw new StateError("No elements");
  }

  CssValue get last {
    if (this.length > 0) return this[this.length - 1];
    throw new StateError("No elements");
  }

  CssValue get single {
    if (length == 1) return this[0];
    if (length == 0) throw new StateError("No elements");
    throw new StateError("More than one element");
  }

  CssValue min([int compare(CssValue a, CssValue b)]) =>
      IterableMixinWorkaround.min(this, compare);

  CssValue max([int compare(CssValue a, CssValue b)]) =>
      IterableMixinWorkaround.max(this, compare);

  void insert(int index, CssValue element) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  CssValue removeAt(int pos) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  CssValue removeLast() {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void remove(Object object) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void removeAll(Iterable elements) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void retainAll(Iterable elements) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void removeWhere(bool test(CssValue element)) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void retainWhere(bool test(CssValue element)) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void setRange(int start, int rangeLength, List<CssValue> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [CssValue initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<CssValue> sublist(int start, [int end]) {
    if (end == null) end = length;
    return Lists.getRange(this, start, end, <CssValue>[]);
  }

  List<CssValue> getRange(int start, int rangeLength) =>
      sublist(start, start + rangeLength);

  Map<int, CssValue> asMap() =>
    IterableMixinWorkaround.asMapList(this);

  // -- end List<CssValue> mixins.

  @DomName('CSSValueList.item')
  @DocsEditable
  CssValue item(int index) native "CSSValueList_item_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('HTMLElement')
class _Element_Merged extends Element {
  _Element_Merged.internal() : super.internal();

  @DomName('HTMLElement.children')
  @DocsEditable
  HtmlCollection get $dom_children native "HTMLElement_children_Getter";

  @DomName('HTMLElement.contentEditable')
  @DocsEditable
  String get contentEditable native "HTMLElement_contentEditable_Getter";

  @DomName('HTMLElement.contentEditable')
  @DocsEditable
  void set contentEditable(String value) native "HTMLElement_contentEditable_Setter";

  @DomName('HTMLElement.dir')
  @DocsEditable
  String get dir native "HTMLElement_dir_Getter";

  @DomName('HTMLElement.dir')
  @DocsEditable
  void set dir(String value) native "HTMLElement_dir_Setter";

  @DomName('HTMLElement.draggable')
  @DocsEditable
  bool get draggable native "HTMLElement_draggable_Getter";

  @DomName('HTMLElement.draggable')
  @DocsEditable
  void set draggable(bool value) native "HTMLElement_draggable_Setter";

  @DomName('HTMLElement.hidden')
  @DocsEditable
  bool get hidden native "HTMLElement_hidden_Getter";

  @DomName('HTMLElement.hidden')
  @DocsEditable
  void set hidden(bool value) native "HTMLElement_hidden_Setter";

  @DomName('HTMLElement.id')
  @DocsEditable
  String get id native "HTMLElement_id_Getter";

  @DomName('HTMLElement.id')
  @DocsEditable
  void set id(String value) native "HTMLElement_id_Setter";

  @DomName('HTMLElement.innerHTML')
  @DocsEditable
  String get innerHtml native "HTMLElement_innerHTML_Getter";

  @DomName('HTMLElement.innerHTML')
  @DocsEditable
  void set innerHtml(String value) native "HTMLElement_innerHTML_Setter";

  @DomName('HTMLElement.isContentEditable')
  @DocsEditable
  bool get isContentEditable native "HTMLElement_isContentEditable_Getter";

  @DomName('HTMLElement.lang')
  @DocsEditable
  String get lang native "HTMLElement_lang_Getter";

  @DomName('HTMLElement.lang')
  @DocsEditable
  void set lang(String value) native "HTMLElement_lang_Setter";

  @DomName('HTMLElement.outerHTML')
  @DocsEditable
  String get outerHtml native "HTMLElement_outerHTML_Getter";

  @DomName('HTMLElement.spellcheck')
  @DocsEditable
  bool get spellcheck native "HTMLElement_spellcheck_Getter";

  @DomName('HTMLElement.spellcheck')
  @DocsEditable
  void set spellcheck(bool value) native "HTMLElement_spellcheck_Setter";

  @DomName('HTMLElement.tabIndex')
  @DocsEditable
  int get tabIndex native "HTMLElement_tabIndex_Getter";

  @DomName('HTMLElement.tabIndex')
  @DocsEditable
  void set tabIndex(int value) native "HTMLElement_tabIndex_Setter";

  @DomName('HTMLElement.title')
  @DocsEditable
  String get title native "HTMLElement_title_Getter";

  @DomName('HTMLElement.title')
  @DocsEditable
  void set title(String value) native "HTMLElement_title_Setter";

  @DomName('HTMLElement.translate')
  @DocsEditable
  bool get translate native "HTMLElement_translate_Getter";

  @DomName('HTMLElement.translate')
  @DocsEditable
  void set translate(bool value) native "HTMLElement_translate_Setter";

  @DomName('HTMLElement.webkitdropzone')
  @DocsEditable
  @SupportedBrowser(SupportedBrowser.CHROME)
  @SupportedBrowser(SupportedBrowser.SAFARI)
  @Experimental
  String get dropzone native "HTMLElement_webkitdropzone_Getter";

  @DomName('HTMLElement.webkitdropzone')
  @DocsEditable
  @SupportedBrowser(SupportedBrowser.CHROME)
  @SupportedBrowser(SupportedBrowser.SAFARI)
  @Experimental
  void set dropzone(String value) native "HTMLElement_webkitdropzone_Setter";

  @DomName('HTMLElement.click')
  @DocsEditable
  void click() native "HTMLElement_click_Callback";

  @DomName('HTMLElement.insertAdjacentElement')
  @DocsEditable
  Element insertAdjacentElement(String where, Element element) native "HTMLElement_insertAdjacentElement_Callback";

  @DomName('HTMLElement.insertAdjacentHTML')
  @DocsEditable
  void insertAdjacentHtml(String where, String html) native "HTMLElement_insertAdjacentHTML_Callback";

  @DomName('HTMLElement.insertAdjacentText')
  @DocsEditable
  void insertAdjacentText(String where, String text) native "HTMLElement_insertAdjacentText_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('EntryArray')
class _EntryArray extends NativeFieldWrapperClass1 implements List<Entry> {
  _EntryArray.internal();

  @DomName('EntryArray.length')
  @DocsEditable
  int get length native "EntryArray_length_Getter";

  Entry operator[](int index) native "EntryArray_item_Callback";

  void operator[]=(int index, Entry value) {
    throw new UnsupportedError("Cannot assign element of immutable List.");
  }
  // -- start List<Entry> mixins.
  // Entry is the element type.

  // From Iterable<Entry>:

  Iterator<Entry> 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<Entry>(this);
  }

  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, Entry)) {
    return IterableMixinWorkaround.reduce(this, initialValue, combine);
  }

  bool contains(Entry element) => IterableMixinWorkaround.contains(this, element);

  void forEach(void f(Entry element)) => IterableMixinWorkaround.forEach(this, f);

  String join([String separator]) =>
      IterableMixinWorkaround.joinList(this, separator);

  Iterable map(f(Entry element)) =>
      IterableMixinWorkaround.mapList(this, f);

  Iterable<Entry> where(bool f(Entry element)) =>
      IterableMixinWorkaround.where(this, f);

  Iterable expand(Iterable f(Entry element)) =>
      IterableMixinWorkaround.expand(this, f);

  bool every(bool f(Entry element)) => IterableMixinWorkaround.every(this, f);

  bool any(bool f(Entry element)) => IterableMixinWorkaround.any(this, f);

  List<Entry> toList({ bool growable: true }) =>
      new List<Entry>.from(this, growable: growable);

  Set<Entry> toSet() => new Set<Entry>.from(this);

  bool get isEmpty => this.length == 0;

  Iterable<Entry> take(int n) => IterableMixinWorkaround.takeList(this, n);

  Iterable<Entry> takeWhile(bool test(Entry value)) {
    return IterableMixinWorkaround.takeWhile(this, test);
  }

  Iterable<Entry> skip(int n) => IterableMixinWorkaround.skipList(this, n);

  Iterable<Entry> skipWhile(bool test(Entry value)) {
    return IterableMixinWorkaround.skipWhile(this, test);
  }

  Entry firstWhere(bool test(Entry value), { Entry orElse() }) {
    return IterableMixinWorkaround.firstWhere(this, test, orElse);
  }

  Entry lastWhere(bool test(Entry value), {Entry orElse()}) {
    return IterableMixinWorkaround.lastWhereList(this, test, orElse);
  }

  Entry singleWhere(bool test(Entry value)) {
    return IterableMixinWorkaround.singleWhere(this, test);
  }

  Entry elementAt(int index) {
    return this[index];
  }

  // From Collection<Entry>:

  void add(Entry value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(Entry value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Iterable<Entry> iterable) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  // From List<Entry>:
  void set length(int value) {
    throw new UnsupportedError("Cannot resize immutable List.");
  }

  void clear() {
    throw new UnsupportedError("Cannot clear immutable List.");
  }

  Iterable<Entry> get reversed {
    return IterableMixinWorkaround.reversedList(this);
  }

  void sort([int compare(Entry a, Entry b)]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(Entry element, [int start = 0]) =>
      Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(Entry element, [int start]) {
    if (start == null) start = length - 1;
    return Lists.lastIndexOf(this, element, start);
  }

  Entry get first {
    if (this.length > 0) return this[0];
    throw new StateError("No elements");
  }

  Entry get last {
    if (this.length > 0) return this[this.length - 1];
    throw new StateError("No elements");
  }

  Entry get single {
    if (length == 1) return this[0];
    if (length == 0) throw new StateError("No elements");
    throw new StateError("More than one element");
  }

  Entry min([int compare(Entry a, Entry b)]) =>
      IterableMixinWorkaround.min(this, compare);

  Entry max([int compare(Entry a, Entry b)]) =>
      IterableMixinWorkaround.max(this, compare);

  void insert(int index, Entry element) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  Entry removeAt(int pos) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  Entry removeLast() {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void remove(Object object) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void removeAll(Iterable elements) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void retainAll(Iterable elements) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void removeWhere(bool test(Entry element)) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void retainWhere(bool test(Entry element)) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void setRange(int start, int rangeLength, List<Entry> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [Entry initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<Entry> sublist(int start, [int end]) {
    if (end == null) end = length;
    return Lists.getRange(this, start, end, <Entry>[]);
  }

  List<Entry> getRange(int start, int rangeLength) =>
      sublist(start, start + rangeLength);

  Map<int, Entry> asMap() =>
    IterableMixinWorkaround.asMapList(this);

  // -- end List<Entry> mixins.

  @DomName('EntryArray.item')
  @DocsEditable
  Entry item(int index) native "EntryArray_item_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('EntryArraySync')
class _EntryArraySync extends NativeFieldWrapperClass1 implements List<EntrySync> {
  _EntryArraySync.internal();

  @DomName('EntryArraySync.length')
  @DocsEditable
  int get length native "EntryArraySync_length_Getter";

  EntrySync operator[](int index) native "EntryArraySync_item_Callback";

  void operator[]=(int index, EntrySync value) {
    throw new UnsupportedError("Cannot assign element of immutable List.");
  }
  // -- start List<EntrySync> mixins.
  // EntrySync is the element type.

  // From Iterable<EntrySync>:

  Iterator<EntrySync> 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<EntrySync>(this);
  }

  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, EntrySync)) {
    return IterableMixinWorkaround.reduce(this, initialValue, combine);
  }

  bool contains(EntrySync element) => IterableMixinWorkaround.contains(this, element);

  void forEach(void f(EntrySync element)) => IterableMixinWorkaround.forEach(this, f);

  String join([String separator]) =>
      IterableMixinWorkaround.joinList(this, separator);

  Iterable map(f(EntrySync element)) =>
      IterableMixinWorkaround.mapList(this, f);

  Iterable<EntrySync> where(bool f(EntrySync element)) =>
      IterableMixinWorkaround.where(this, f);

  Iterable expand(Iterable f(EntrySync element)) =>
      IterableMixinWorkaround.expand(this, f);

  bool every(bool f(EntrySync element)) => IterableMixinWorkaround.every(this, f);

  bool any(bool f(EntrySync element)) => IterableMixinWorkaround.any(this, f);

  List<EntrySync> toList({ bool growable: true }) =>
      new List<EntrySync>.from(this, growable: growable);

  Set<EntrySync> toSet() => new Set<EntrySync>.from(this);

  bool get isEmpty => this.length == 0;

  Iterable<EntrySync> take(int n) => IterableMixinWorkaround.takeList(this, n);

  Iterable<EntrySync> takeWhile(bool test(EntrySync value)) {
    return IterableMixinWorkaround.takeWhile(this, test);
  }

  Iterable<EntrySync> skip(int n) => IterableMixinWorkaround.skipList(this, n);

  Iterable<EntrySync> skipWhile(bool test(EntrySync value)) {
    return IterableMixinWorkaround.skipWhile(this, test);
  }

  EntrySync firstWhere(bool test(EntrySync value), { EntrySync orElse() }) {
    return IterableMixinWorkaround.firstWhere(this, test, orElse);
  }

  EntrySync lastWhere(bool test(EntrySync value), {EntrySync orElse()}) {
    return IterableMixinWorkaround.lastWhereList(this, test, orElse);
  }

  EntrySync singleWhere(bool test(EntrySync value)) {
    return IterableMixinWorkaround.singleWhere(this, test);
  }

  EntrySync elementAt(int index) {
    return this[index];
  }

  // From Collection<EntrySync>:

  void add(EntrySync value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(EntrySync value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Iterable<EntrySync> iterable) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  // From List<EntrySync>:
  void set length(int value) {
    throw new UnsupportedError("Cannot resize immutable List.");
  }

  void clear() {
    throw new UnsupportedError("Cannot clear immutable List.");
  }

  Iterable<EntrySync> get reversed {
    return IterableMixinWorkaround.reversedList(this);
  }

  void sort([int compare(EntrySync a, EntrySync b)]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(EntrySync element, [int start = 0]) =>
      Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(EntrySync element, [int start]) {
    if (start == null) start = length - 1;
    return Lists.lastIndexOf(this, element, start);
  }

  EntrySync get first {
    if (this.length > 0) return this[0];
    throw new StateError("No elements");
  }

  EntrySync get last {
    if (this.length > 0) return this[this.length - 1];
    throw new StateError("No elements");
  }

  EntrySync get single {
    if (length == 1) return this[0];
    if (length == 0) throw new StateError("No elements");
    throw new StateError("More than one element");
  }

  EntrySync min([int compare(EntrySync a, EntrySync b)]) =>
      IterableMixinWorkaround.min(this, compare);

  EntrySync max([int compare(EntrySync a, EntrySync b)]) =>
      IterableMixinWorkaround.max(this, compare);

  void insert(int index, EntrySync element) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  EntrySync removeAt(int pos) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  EntrySync removeLast() {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void remove(Object object) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void removeAll(Iterable elements) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void retainAll(Iterable elements) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void removeWhere(bool test(EntrySync element)) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void retainWhere(bool test(EntrySync element)) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void setRange(int start, int rangeLength, List<EntrySync> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [EntrySync initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<EntrySync> sublist(int start, [int end]) {
    if (end == null) end = length;
    return Lists.getRange(this, start, end, <EntrySync>[]);
  }

  List<EntrySync> getRange(int start, int rangeLength) =>
      sublist(start, start + rangeLength);

  Map<int, EntrySync> asMap() =>
    IterableMixinWorkaround.asMapList(this);

  // -- end List<EntrySync> mixins.

  @DomName('EntryArraySync.item')
  @DocsEditable
  EntrySync item(int index) native "EntryArraySync_item_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('GamepadList')
class _GamepadList extends NativeFieldWrapperClass1 implements List<Gamepad> {
  _GamepadList.internal();

  @DomName('GamepadList.length')
  @DocsEditable
  int get length native "GamepadList_length_Getter";

  Gamepad operator[](int index) native "GamepadList_item_Callback";

  void operator[]=(int index, Gamepad value) {
    throw new UnsupportedError("Cannot assign element of immutable List.");
  }
  // -- start List<Gamepad> mixins.
  // Gamepad is the element type.

  // From Iterable<Gamepad>:

  Iterator<Gamepad> 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<Gamepad>(this);
  }

  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, Gamepad)) {
    return IterableMixinWorkaround.reduce(this, initialValue, combine);
  }

  bool contains(Gamepad element) => IterableMixinWorkaround.contains(this, element);

  void forEach(void f(Gamepad element)) => IterableMixinWorkaround.forEach(this, f);

  String join([String separator]) =>
      IterableMixinWorkaround.joinList(this, separator);

  Iterable map(f(Gamepad element)) =>
      IterableMixinWorkaround.mapList(this, f);

  Iterable<Gamepad> where(bool f(Gamepad element)) =>
      IterableMixinWorkaround.where(this, f);

  Iterable expand(Iterable f(Gamepad element)) =>
      IterableMixinWorkaround.expand(this, f);

  bool every(bool f(Gamepad element)) => IterableMixinWorkaround.every(this, f);

  bool any(bool f(Gamepad element)) => IterableMixinWorkaround.any(this, f);

  List<Gamepad> toList({ bool growable: true }) =>
      new List<Gamepad>.from(this, growable: growable);

  Set<Gamepad> toSet() => new Set<Gamepad>.from(this);

  bool get isEmpty => this.length == 0;

  Iterable<Gamepad> take(int n) => IterableMixinWorkaround.takeList(this, n);

  Iterable<Gamepad> takeWhile(bool test(Gamepad value)) {
    return IterableMixinWorkaround.takeWhile(this, test);
  }

  Iterable<Gamepad> skip(int n) => IterableMixinWorkaround.skipList(this, n);

  Iterable<Gamepad> skipWhile(bool test(Gamepad value)) {
    return IterableMixinWorkaround.skipWhile(this, test);
  }

  Gamepad firstWhere(bool test(Gamepad value), { Gamepad orElse() }) {
    return IterableMixinWorkaround.firstWhere(this, test, orElse);
  }

  Gamepad lastWhere(bool test(Gamepad value), {Gamepad orElse()}) {
    return IterableMixinWorkaround.lastWhereList(this, test, orElse);
  }

  Gamepad singleWhere(bool test(Gamepad value)) {
    return IterableMixinWorkaround.singleWhere(this, test);
  }

  Gamepad elementAt(int index) {
    return this[index];
  }

  // From Collection<Gamepad>:

  void add(Gamepad value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(Gamepad value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Iterable<Gamepad> iterable) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  // From List<Gamepad>:
  void set length(int value) {
    throw new UnsupportedError("Cannot resize immutable List.");
  }

  void clear() {
    throw new UnsupportedError("Cannot clear immutable List.");
  }

  Iterable<Gamepad> get reversed {
    return IterableMixinWorkaround.reversedList(this);
  }

  void sort([int compare(Gamepad a, Gamepad b)]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(Gamepad element, [int start = 0]) =>
      Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(Gamepad element, [int start]) {
    if (start == null) start = length - 1;
    return Lists.lastIndexOf(this, element, start);
  }

  Gamepad get first {
    if (this.length > 0) return this[0];
    throw new StateError("No elements");
  }

  Gamepad get last {
    if (this.length > 0) return this[this.length - 1];
    throw new StateError("No elements");
  }

  Gamepad get single {
    if (length == 1) return this[0];
    if (length == 0) throw new StateError("No elements");
    throw new StateError("More than one element");
  }

  Gamepad min([int compare(Gamepad a, Gamepad b)]) =>
      IterableMixinWorkaround.min(this, compare);

  Gamepad max([int compare(Gamepad a, Gamepad b)]) =>
      IterableMixinWorkaround.max(this, compare);

  void insert(int index, Gamepad element) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  Gamepad removeAt(int pos) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  Gamepad removeLast() {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void remove(Object object) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void removeAll(Iterable elements) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void retainAll(Iterable elements) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void removeWhere(bool test(Gamepad element)) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void retainWhere(bool test(Gamepad element)) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void setRange(int start, int rangeLength, List<Gamepad> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [Gamepad initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<Gamepad> sublist(int start, [int end]) {
    if (end == null) end = length;
    return Lists.getRange(this, start, end, <Gamepad>[]);
  }

  List<Gamepad> getRange(int start, int rangeLength) =>
      sublist(start, start + rangeLength);

  Map<int, Gamepad> asMap() =>
    IterableMixinWorkaround.asMapList(this);

  // -- end List<Gamepad> mixins.

  @DomName('GamepadList.item')
  @DocsEditable
  Gamepad item(int index) native "GamepadList_item_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('HTMLAppletElement')
class _HTMLAppletElement extends _Element_Merged {
  _HTMLAppletElement.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.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('HTMLBaseFontElement')
class _HTMLBaseFontElement extends _Element_Merged {
  _HTMLBaseFontElement.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.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('HTMLDirectoryElement')
class _HTMLDirectoryElement extends _Element_Merged {
  _HTMLDirectoryElement.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.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('HTMLFontElement')
class _HTMLFontElement extends _Element_Merged {
  _HTMLFontElement.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.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('HTMLFrameElement')
class _HTMLFrameElement extends _Element_Merged {
  _HTMLFrameElement.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.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('HTMLFrameSetElement')
class _HTMLFrameSetElement extends _Element_Merged {
  _HTMLFrameSetElement.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.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('HTMLMarqueeElement')
class _HTMLMarqueeElement extends _Element_Merged {
  _HTMLMarqueeElement.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.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('NamedNodeMap')
class _NamedNodeMap extends NativeFieldWrapperClass1 implements List<Node> {
  _NamedNodeMap.internal();

  @DomName('NamedNodeMap.length')
  @DocsEditable
  int get length native "NamedNodeMap_length_Getter";

  Node operator[](int index) native "NamedNodeMap_item_Callback";

  void operator[]=(int index, Node value) {
    throw new UnsupportedError("Cannot assign element of immutable List.");
  }
  // -- start List<Node> mixins.
  // Node is the element type.

  // From Iterable<Node>:

  Iterator<Node> 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<Node>(this);
  }

  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, Node)) {
    return IterableMixinWorkaround.reduce(this, initialValue, combine);
  }

  bool contains(Node element) => IterableMixinWorkaround.contains(this, element);

  void forEach(void f(Node element)) => IterableMixinWorkaround.forEach(this, f);

  String join([String separator]) =>
      IterableMixinWorkaround.joinList(this, separator);

  Iterable map(f(Node element)) =>
      IterableMixinWorkaround.mapList(this, f);

  Iterable<Node> where(bool f(Node element)) =>
      IterableMixinWorkaround.where(this, f);

  Iterable expand(Iterable f(Node element)) =>
      IterableMixinWorkaround.expand(this, f);

  bool every(bool f(Node element)) => IterableMixinWorkaround.every(this, f);

  bool any(bool f(Node element)) => IterableMixinWorkaround.any(this, f);

  List<Node> toList({ bool growable: true }) =>
      new List<Node>.from(this, growable: growable);

  Set<Node> toSet() => new Set<Node>.from(this);

  bool get isEmpty => this.length == 0;

  Iterable<Node> take(int n) => IterableMixinWorkaround.takeList(this, n);

  Iterable<Node> takeWhile(bool test(Node value)) {
    return IterableMixinWorkaround.takeWhile(this, test);
  }

  Iterable<Node> skip(int n) => IterableMixinWorkaround.skipList(this, n);

  Iterable<Node> skipWhile(bool test(Node value)) {
    return IterableMixinWorkaround.skipWhile(this, test);
  }

  Node firstWhere(bool test(Node value), { Node orElse() }) {
    return IterableMixinWorkaround.firstWhere(this, test, orElse);
  }

  Node lastWhere(bool test(Node value), {Node orElse()}) {
    return IterableMixinWorkaround.lastWhereList(this, test, orElse);
  }

  Node singleWhere(bool test(Node value)) {
    return IterableMixinWorkaround.singleWhere(this, test);
  }

  Node elementAt(int index) {
    return this[index];
  }

  // From Collection<Node>:

  void add(Node value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(Node value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Iterable<Node> iterable) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  // From List<Node>:
  void set length(int value) {
    throw new UnsupportedError("Cannot resize immutable List.");
  }

  void clear() {
    throw new UnsupportedError("Cannot clear immutable List.");
  }

  Iterable<Node> get reversed {
    return IterableMixinWorkaround.reversedList(this);
  }

  void sort([int compare(Node a, Node b)]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(Node element, [int start = 0]) =>
      Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(Node element, [int start]) {
    if (start == null) start = length - 1;
    return Lists.lastIndexOf(this, element, start);
  }

  Node get first {
    if (this.length > 0) return this[0];
    throw new StateError("No elements");
  }

  Node get last {
    if (this.length > 0) return this[this.length - 1];
    throw new StateError("No elements");
  }

  Node get single {
    if (length == 1) return this[0];
    if (length == 0) throw new StateError("No elements");
    throw new StateError("More than one element");
  }

  Node min([int compare(Node a, Node b)]) =>
      IterableMixinWorkaround.min(this, compare);

  Node max([int compare(Node a, Node b)]) =>
      IterableMixinWorkaround.max(this, compare);

  void insert(int index, Node element) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  Node removeAt(int pos) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  Node removeLast() {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void remove(Object object) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void removeAll(Iterable elements) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void retainAll(Iterable elements) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void removeWhere(bool test(Node element)) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void retainWhere(bool test(Node element)) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void setRange(int start, int rangeLength, List<Node> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [Node initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<Node> sublist(int start, [int end]) {
    if (end == null) end = length;
    return Lists.getRange(this, start, end, <Node>[]);
  }

  List<Node> getRange(int start, int rangeLength) =>
      sublist(start, start + rangeLength);

  Map<int, Node> asMap() =>
    IterableMixinWorkaround.asMapList(this);

  // -- end List<Node> mixins.

  @DomName('NamedNodeMap.getNamedItem')
  @DocsEditable
  Node getNamedItem(String name) native "NamedNodeMap_getNamedItem_Callback";

  @DomName('NamedNodeMap.getNamedItemNS')
  @DocsEditable
  Node getNamedItemNS(String namespaceURI, String localName) native "NamedNodeMap_getNamedItemNS_Callback";

  @DomName('NamedNodeMap.item')
  @DocsEditable
  Node item(int index) native "NamedNodeMap_item_Callback";

  @DomName('NamedNodeMap.removeNamedItem')
  @DocsEditable
  Node removeNamedItem(String name) native "NamedNodeMap_removeNamedItem_Callback";

  @DomName('NamedNodeMap.removeNamedItemNS')
  @DocsEditable
  Node removeNamedItemNS(String namespaceURI, String localName) native "NamedNodeMap_removeNamedItemNS_Callback";

  @DomName('NamedNodeMap.setNamedItem')
  @DocsEditable
  Node setNamedItem(Node node) native "NamedNodeMap_setNamedItem_Callback";

  @DomName('NamedNodeMap.setNamedItemNS')
  @DocsEditable
  Node setNamedItemNS(Node node) native "NamedNodeMap_setNamedItemNS_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('SpeechInputResultList')
class _SpeechInputResultList extends NativeFieldWrapperClass1 implements List<SpeechInputResult> {
  _SpeechInputResultList.internal();

  @DomName('SpeechInputResultList.length')
  @DocsEditable
  int get length native "SpeechInputResultList_length_Getter";

  SpeechInputResult operator[](int index) native "SpeechInputResultList_item_Callback";

  void operator[]=(int index, SpeechInputResult value) {
    throw new UnsupportedError("Cannot assign element of immutable List.");
  }
  // -- start List<SpeechInputResult> mixins.
  // SpeechInputResult is the element type.

  // From Iterable<SpeechInputResult>:

  Iterator<SpeechInputResult> 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<SpeechInputResult>(this);
  }

  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, SpeechInputResult)) {
    return IterableMixinWorkaround.reduce(this, initialValue, combine);
  }

  bool contains(SpeechInputResult element) => IterableMixinWorkaround.contains(this, element);

  void forEach(void f(SpeechInputResult element)) => IterableMixinWorkaround.forEach(this, f);

  String join([String separator]) =>
      IterableMixinWorkaround.joinList(this, separator);

  Iterable map(f(SpeechInputResult element)) =>
      IterableMixinWorkaround.mapList(this, f);

  Iterable<SpeechInputResult> where(bool f(SpeechInputResult element)) =>
      IterableMixinWorkaround.where(this, f);

  Iterable expand(Iterable f(SpeechInputResult element)) =>
      IterableMixinWorkaround.expand(this, f);

  bool every(bool f(SpeechInputResult element)) => IterableMixinWorkaround.every(this, f);

  bool any(bool f(SpeechInputResult element)) => IterableMixinWorkaround.any(this, f);

  List<SpeechInputResult> toList({ bool growable: true }) =>
      new List<SpeechInputResult>.from(this, growable: growable);

  Set<SpeechInputResult> toSet() => new Set<SpeechInputResult>.from(this);

  bool get isEmpty => this.length == 0;

  Iterable<SpeechInputResult> take(int n) => IterableMixinWorkaround.takeList(this, n);

  Iterable<SpeechInputResult> takeWhile(bool test(SpeechInputResult value)) {
    return IterableMixinWorkaround.takeWhile(this, test);
  }

  Iterable<SpeechInputResult> skip(int n) => IterableMixinWorkaround.skipList(this, n);

  Iterable<SpeechInputResult> skipWhile(bool test(SpeechInputResult value)) {
    return IterableMixinWorkaround.skipWhile(this, test);
  }

  SpeechInputResult firstWhere(bool test(SpeechInputResult value), { SpeechInputResult orElse() }) {
    return IterableMixinWorkaround.firstWhere(this, test, orElse);
  }

  SpeechInputResult lastWhere(bool test(SpeechInputResult value), {SpeechInputResult orElse()}) {
    return IterableMixinWorkaround.lastWhereList(this, test, orElse);
  }

  SpeechInputResult singleWhere(bool test(SpeechInputResult value)) {
    return IterableMixinWorkaround.singleWhere(this, test);
  }

  SpeechInputResult elementAt(int index) {
    return this[index];
  }

  // From Collection<SpeechInputResult>:

  void add(SpeechInputResult value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(SpeechInputResult value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Iterable<SpeechInputResult> iterable) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  // From List<SpeechInputResult>:
  void set length(int value) {
    throw new UnsupportedError("Cannot resize immutable List.");
  }

  void clear() {
    throw new UnsupportedError("Cannot clear immutable List.");
  }

  Iterable<SpeechInputResult> get reversed {
    return IterableMixinWorkaround.reversedList(this);
  }

  void sort([int compare(SpeechInputResult a, SpeechInputResult b)]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(SpeechInputResult element, [int start = 0]) =>
      Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(SpeechInputResult element, [int start]) {
    if (start == null) start = length - 1;
    return Lists.lastIndexOf(this, element, start);
  }

  SpeechInputResult get first {
    if (this.length > 0) return this[0];
    throw new StateError("No elements");
  }

  SpeechInputResult get last {
    if (this.length > 0) return this[this.length - 1];
    throw new StateError("No elements");
  }

  SpeechInputResult get single {
    if (length == 1) return this[0];
    if (length == 0) throw new StateError("No elements");
    throw new StateError("More than one element");
  }

  SpeechInputResult min([int compare(SpeechInputResult a, SpeechInputResult b)]) =>
      IterableMixinWorkaround.min(this, compare);

  SpeechInputResult max([int compare(SpeechInputResult a, SpeechInputResult b)]) =>
      IterableMixinWorkaround.max(this, compare);

  void insert(int index, SpeechInputResult element) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  SpeechInputResult removeAt(int pos) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  SpeechInputResult removeLast() {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void remove(Object object) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void removeAll(Iterable elements) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void retainAll(Iterable elements) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void removeWhere(bool test(SpeechInputResult element)) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void retainWhere(bool test(SpeechInputResult element)) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void setRange(int start, int rangeLength, List<SpeechInputResult> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [SpeechInputResult initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<SpeechInputResult> sublist(int start, [int end]) {
    if (end == null) end = length;
    return Lists.getRange(this, start, end, <SpeechInputResult>[]);
  }

  List<SpeechInputResult> getRange(int start, int rangeLength) =>
      sublist(start, start + rangeLength);

  Map<int, SpeechInputResult> asMap() =>
    IterableMixinWorkaround.asMapList(this);

  // -- end List<SpeechInputResult> mixins.

  @DomName('SpeechInputResultList.item')
  @DocsEditable
  SpeechInputResult item(int index) native "SpeechInputResultList_item_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('SpeechRecognitionResultList')
class _SpeechRecognitionResultList extends NativeFieldWrapperClass1 implements List<SpeechRecognitionResult> {
  _SpeechRecognitionResultList.internal();

  @DomName('SpeechRecognitionResultList.length')
  @DocsEditable
  int get length native "SpeechRecognitionResultList_length_Getter";

  SpeechRecognitionResult operator[](int index) native "SpeechRecognitionResultList_item_Callback";

  void operator[]=(int index, SpeechRecognitionResult value) {
    throw new UnsupportedError("Cannot assign element of immutable List.");
  }
  // -- start List<SpeechRecognitionResult> mixins.
  // SpeechRecognitionResult is the element type.

  // From Iterable<SpeechRecognitionResult>:

  Iterator<SpeechRecognitionResult> 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<SpeechRecognitionResult>(this);
  }

  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, SpeechRecognitionResult)) {
    return IterableMixinWorkaround.reduce(this, initialValue, combine);
  }

  bool contains(SpeechRecognitionResult element) => IterableMixinWorkaround.contains(this, element);

  void forEach(void f(SpeechRecognitionResult element)) => IterableMixinWorkaround.forEach(this, f);

  String join([String separator]) =>
      IterableMixinWorkaround.joinList(this, separator);

  Iterable map(f(SpeechRecognitionResult element)) =>
      IterableMixinWorkaround.mapList(this, f);

  Iterable<SpeechRecognitionResult> where(bool f(SpeechRecognitionResult element)) =>
      IterableMixinWorkaround.where(this, f);

  Iterable expand(Iterable f(SpeechRecognitionResult element)) =>
      IterableMixinWorkaround.expand(this, f);

  bool every(bool f(SpeechRecognitionResult element)) => IterableMixinWorkaround.every(this, f);

  bool any(bool f(SpeechRecognitionResult element)) => IterableMixinWorkaround.any(this, f);

  List<SpeechRecognitionResult> toList({ bool growable: true }) =>
      new List<SpeechRecognitionResult>.from(this, growable: growable);

  Set<SpeechRecognitionResult> toSet() => new Set<SpeechRecognitionResult>.from(this);

  bool get isEmpty => this.length == 0;

  Iterable<SpeechRecognitionResult> take(int n) => IterableMixinWorkaround.takeList(this, n);

  Iterable<SpeechRecognitionResult> takeWhile(bool test(SpeechRecognitionResult value)) {
    return IterableMixinWorkaround.takeWhile(this, test);
  }

  Iterable<SpeechRecognitionResult> skip(int n) => IterableMixinWorkaround.skipList(this, n);

  Iterable<SpeechRecognitionResult> skipWhile(bool test(SpeechRecognitionResult value)) {
    return IterableMixinWorkaround.skipWhile(this, test);
  }

  SpeechRecognitionResult firstWhere(bool test(SpeechRecognitionResult value), { SpeechRecognitionResult orElse() }) {
    return IterableMixinWorkaround.firstWhere(this, test, orElse);
  }

  SpeechRecognitionResult lastWhere(bool test(SpeechRecognitionResult value), {SpeechRecognitionResult orElse()}) {
    return IterableMixinWorkaround.lastWhereList(this, test, orElse);
  }

  SpeechRecognitionResult singleWhere(bool test(SpeechRecognitionResult value)) {
    return IterableMixinWorkaround.singleWhere(this, test);
  }

  SpeechRecognitionResult elementAt(int index) {
    return this[index];
  }

  // From Collection<SpeechRecognitionResult>:

  void add(SpeechRecognitionResult value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(SpeechRecognitionResult value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Iterable<SpeechRecognitionResult> iterable) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  // From List<SpeechRecognitionResult>:
  void set length(int value) {
    throw new UnsupportedError("Cannot resize immutable List.");
  }

  void clear() {
    throw new UnsupportedError("Cannot clear immutable List.");
  }

  Iterable<SpeechRecognitionResult> get reversed {
    return IterableMixinWorkaround.reversedList(this);
  }

  void sort([int compare(SpeechRecognitionResult a, SpeechRecognitionResult b)]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(SpeechRecognitionResult element, [int start = 0]) =>
      Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(SpeechRecognitionResult element, [int start]) {
    if (start == null) start = length - 1;
    return Lists.lastIndexOf(this, element, start);
  }

  SpeechRecognitionResult get first {
    if (this.length > 0) return this[0];
    throw new StateError("No elements");
  }

  SpeechRecognitionResult get last {
    if (this.length > 0) return this[this.length - 1];
    throw new StateError("No elements");
  }

  SpeechRecognitionResult get single {
    if (length == 1) return this[0];
    if (length == 0) throw new StateError("No elements");
    throw new StateError("More than one element");
  }

  SpeechRecognitionResult min([int compare(SpeechRecognitionResult a, SpeechRecognitionResult b)]) =>
      IterableMixinWorkaround.min(this, compare);

  SpeechRecognitionResult max([int compare(SpeechRecognitionResult a, SpeechRecognitionResult b)]) =>
      IterableMixinWorkaround.max(this, compare);

  void insert(int index, SpeechRecognitionResult element) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  SpeechRecognitionResult removeAt(int pos) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  SpeechRecognitionResult removeLast() {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void remove(Object object) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void removeAll(Iterable elements) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void retainAll(Iterable elements) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void removeWhere(bool test(SpeechRecognitionResult element)) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void retainWhere(bool test(SpeechRecognitionResult element)) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void setRange(int start, int rangeLength, List<SpeechRecognitionResult> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [SpeechRecognitionResult initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<SpeechRecognitionResult> sublist(int start, [int end]) {
    if (end == null) end = length;
    return Lists.getRange(this, start, end, <SpeechRecognitionResult>[]);
  }

  List<SpeechRecognitionResult> getRange(int start, int rangeLength) =>
      sublist(start, start + rangeLength);

  Map<int, SpeechRecognitionResult> asMap() =>
    IterableMixinWorkaround.asMapList(this);

  // -- end List<SpeechRecognitionResult> mixins.

  @DomName('SpeechRecognitionResultList.item')
  @DocsEditable
  SpeechRecognitionResult item(int index) native "SpeechRecognitionResultList_item_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


@DocsEditable
@DomName('StyleSheetList')
class _StyleSheetList extends NativeFieldWrapperClass1 implements List<StyleSheet> {
  _StyleSheetList.internal();

  @DomName('StyleSheetList.length')
  @DocsEditable
  int get length native "StyleSheetList_length_Getter";

  StyleSheet operator[](int index) native "StyleSheetList_item_Callback";

  void operator[]=(int index, StyleSheet value) {
    throw new UnsupportedError("Cannot assign element of immutable List.");
  }
  // -- start List<StyleSheet> mixins.
  // StyleSheet is the element type.

  // From Iterable<StyleSheet>:

  Iterator<StyleSheet> 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<StyleSheet>(this);
  }

  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, StyleSheet)) {
    return IterableMixinWorkaround.reduce(this, initialValue, combine);
  }

  bool contains(StyleSheet element) => IterableMixinWorkaround.contains(this, element);

  void forEach(void f(StyleSheet element)) => IterableMixinWorkaround.forEach(this, f);

  String join([String separator]) =>
      IterableMixinWorkaround.joinList(this, separator);

  Iterable map(f(StyleSheet element)) =>
      IterableMixinWorkaround.mapList(this, f);

  Iterable<StyleSheet> where(bool f(StyleSheet element)) =>
      IterableMixinWorkaround.where(this, f);

  Iterable expand(Iterable f(StyleSheet element)) =>
      IterableMixinWorkaround.expand(this, f);

  bool every(bool f(StyleSheet element)) => IterableMixinWorkaround.every(this, f);

  bool any(bool f(StyleSheet element)) => IterableMixinWorkaround.any(this, f);

  List<StyleSheet> toList({ bool growable: true }) =>
      new List<StyleSheet>.from(this, growable: growable);

  Set<StyleSheet> toSet() => new Set<StyleSheet>.from(this);

  bool get isEmpty => this.length == 0;

  Iterable<StyleSheet> take(int n) => IterableMixinWorkaround.takeList(this, n);

  Iterable<StyleSheet> takeWhile(bool test(StyleSheet value)) {
    return IterableMixinWorkaround.takeWhile(this, test);
  }

  Iterable<StyleSheet> skip(int n) => IterableMixinWorkaround.skipList(this, n);

  Iterable<StyleSheet> skipWhile(bool test(StyleSheet value)) {
    return IterableMixinWorkaround.skipWhile(this, test);
  }

  StyleSheet firstWhere(bool test(StyleSheet value), { StyleSheet orElse() }) {
    return IterableMixinWorkaround.firstWhere(this, test, orElse);
  }

  StyleSheet lastWhere(bool test(StyleSheet value), {StyleSheet orElse()}) {
    return IterableMixinWorkaround.lastWhereList(this, test, orElse);
  }

  StyleSheet singleWhere(bool test(StyleSheet value)) {
    return IterableMixinWorkaround.singleWhere(this, test);
  }

  StyleSheet elementAt(int index) {
    return this[index];
  }

  // From Collection<StyleSheet>:

  void add(StyleSheet value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(StyleSheet value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Iterable<StyleSheet> iterable) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  // From List<StyleSheet>:
  void set length(int value) {
    throw new UnsupportedError("Cannot resize immutable List.");
  }

  void clear() {
    throw new UnsupportedError("Cannot clear immutable List.");
  }

  Iterable<StyleSheet> get reversed {
    return IterableMixinWorkaround.reversedList(this);
  }

  void sort([int compare(StyleSheet a, StyleSheet b)]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(StyleSheet element, [int start = 0]) =>
      Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(StyleSheet element, [int start]) {
    if (start == null) start = length - 1;
    return Lists.lastIndexOf(this, element, start);
  }

  StyleSheet get first {
    if (this.length > 0) return this[0];
    throw new StateError("No elements");
  }

  StyleSheet get last {
    if (this.length > 0) return this[this.length - 1];
    throw new StateError("No elements");
  }

  StyleSheet get single {
    if (length == 1) return this[0];
    if (length == 0) throw new StateError("No elements");
    throw new StateError("More than one element");
  }

  StyleSheet min([int compare(StyleSheet a, StyleSheet b)]) =>
      IterableMixinWorkaround.min(this, compare);

  StyleSheet max([int compare(StyleSheet a, StyleSheet b)]) =>
      IterableMixinWorkaround.max(this, compare);

  void insert(int index, StyleSheet element) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  StyleSheet removeAt(int pos) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  StyleSheet removeLast() {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void remove(Object object) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void removeAll(Iterable elements) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void retainAll(Iterable elements) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void removeWhere(bool test(StyleSheet element)) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void retainWhere(bool test(StyleSheet element)) {
    throw new UnsupportedError("Cannot remove from immutable List.");
  }

  void setRange(int start, int rangeLength, List<StyleSheet> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [StyleSheet initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<StyleSheet> sublist(int start, [int end]) {
    if (end == null) end = length;
    return Lists.getRange(this, start, end, <StyleSheet>[]);
  }

  List<StyleSheet> getRange(int start, int rangeLength) =>
      sublist(start, start + rangeLength);

  Map<int, StyleSheet> asMap() =>
    IterableMixinWorkaround.asMapList(this);

  // -- end List<StyleSheet> mixins.

  @DomName('StyleSheetList.item')
  @DocsEditable
  StyleSheet item(int index) native "StyleSheetList_item_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.


// This class maps WebKitTransitionEvent to TransitionEvent for older Chrome
// browser versions.
@DomName('WebKitTransitionEvent')
class _WebKitTransitionEvent extends Event implements TransitionEvent  {
  _WebKitTransitionEvent.internal() : super.internal();

  @DomName('WebKitTransitionEvent.elapsedTime')
  @DocsEditable
  num get elapsedTime native "WebKitTransitionEvent_elapsedTime_Getter";

  @DomName('WebKitTransitionEvent.propertyName')
  @DocsEditable
  String get propertyName native "WebKitTransitionEvent_propertyName_Getter";

  @DomName('WebKitTransitionEvent.pseudoElement')
  @DocsEditable
  String get pseudoElement native "WebKitTransitionEvent_pseudoElement_Getter";
}
// 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);

  bool containsValue(String 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);
    }
  }

  Collection<String> get keys {
    // TODO: generate a lazy collection instead.
    var attributes = _element.$dom_attributes;
    var keys = new List<String>();
    for (int i = 0, len = attributes.length; i < len; i++) {
      if (_matches(attributes[i])) {
        keys.add(attributes[i].$dom_localName);
      }
    }
    return keys;
  }

  Collection<String> get values {
    // TODO: generate a lazy collection instead.
    var attributes = _element.$dom_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;
  }

  /**
   * 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(String key) {
    return _element.$dom_hasAttribute(key);
  }

  String operator [](String key) {
    return _element.$dom_getAttribute(key);
  }

  void operator []=(String key, value) {
    _element.$dom_setAttribute(key, '$value');
  }

  String remove(String key) {
    String value = _element.$dom_getAttribute(key);
    _element.$dom_removeAttribute(key);
    return value;
  }

  /**
   * The number of {key, value} pairs in the map.
   */
  int get length {
    return keys.length;
  }

  bool _matches(Node node) => node.$dom_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(String key) {
    return _element.$dom_hasAttributeNS(_namespace, key);
  }

  String operator [](String key) {
    return _element.$dom_getAttributeNS(_namespace, key);
  }

  void operator []=(String key, value) {
    _element.$dom_setAttributeNS(_namespace, key, '$value');
  }

  String remove(String key) {
    String value = this[key];
    _element.$dom_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.$dom_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> $dom_attributes;

  _DataAttributeMap(this.$dom_attributes);

  // interface Map

  // TODO: Use lazy iterator when it is available on Map.
  bool containsValue(String value) => values.any((v) => v == value);

  bool containsKey(String key) => $dom_attributes.containsKey(_attr(key));

  String operator [](String key) => $dom_attributes[_attr(key)];

  void operator []=(String key, value) {
    $dom_attributes[_attr(key)] = '$value';
  }

  String putIfAbsent(String key, String ifAbsent()) =>
    $dom_attributes.putIfAbsent(_attr(key), ifAbsent);

  String remove(String key) => $dom_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)) {
    $dom_attributes.forEach((String key, String value) {
      if (_matches(key)) {
        f(_strip(key), value);
      }
    });
  }

  Collection<String> get keys {
    final keys = new List<String>();
    $dom_attributes.forEach((String key, String value) {
      if (_matches(key)) {
        keys.add(_strip(key));
      }
    });
    return keys;
  }

  Collection<String> get values {
    final values = new List<String>();
    $dom_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;

  // Helpers.
  String _attr(String key) => 'data-$key';
  bool _matches(String key) => key.startsWith('data-');
  String _strip(String key) => key.substring(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.


/**
 * An object that can be drawn to a [CanvasRenderingContext2D] object with
 * [CanvasRenderingContext2D.drawImage] or
 * [CanvasRenderingContext2D.drawImageAtScale].
 *
 * If the CanvasImageSource is an [ImageElement] then the element's image is
 * used. If the [ImageElement] is an animated image, then the poster frame is
 * used. If there is no poster frame, then the first frame of animation is used.
 *
 * If the CanvasImageSource is a [VideoElement] then the frame at the current
 * playback position is used as the image.
 *
 * If the CanvasImageSource is a [CanvasElement] then the element's bitmap is
 * used.
 *
 * See also:
 *
 *  * [CanvasImageSource](http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#image-sources-for-2d-rendering-contexts)
 * from the 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.


/**
 * An object representing the top-level context object for web scripting.
 *
 * In a web browser, a [Window] object represents the actual browser window.
 * In a multi-tabbed browser, each tab has its own [Window] object. A [Window]
 * is the container that displays a [Document]'s content. All web scripting
 * happens within the context of a [Window] object.
 *
 * **Note:** This class represents any window, whereas [Window] is
 * used to access the properties and content of the current window.
 *
 * See also:
 *
 * * [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 {
  // Fields.

  /**
   * The current location of this window.
   *
   *     Location currentLocation = window.location;
   *     print(currentLocation.href); // 'http://www.example.com:80/'
   */
  LocationBase get location;
  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();
  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.


abstract class CssClassSet implements Set<String> {

  String toString() {
    return readClasses().join(' ');
  }

  /**
   * Adds the class [token] to the element if it is not on it, removes it if it
   * is.
   */
  bool toggle(String value) {
    Set<String> s = readClasses();
    bool result = false;
    if (s.contains(value)) {
      s.remove(value);
    } else {
      s.add(value);
      result = true;
    }
    writeClasses(s);
    return result;
  }

  /**
   * Returns [:true:] if classes cannot be added or removed from this
   * [:CssClassSet:].
   */
  bool get frozen => false;

  // interface Iterable - BEGIN
  Iterator<String> get iterator => readClasses().iterator;
  // interface Iterable - END

  // interface Collection - BEGIN
  void forEach(void f(String element)) {
    readClasses().forEach(f);
  }

  String join([String separator]) => readClasses().join(separator);

  Iterable map(f(String element)) => readClasses().map(f);

  Iterable<String> where(bool f(String element)) => readClasses().where(f);

  Iterable expand(Iterable f(String element)) => readClasses().expand(f);

  bool every(bool f(String element)) => readClasses().every(f);

  bool any(bool f(String element)) => readClasses().any(f);

  bool get isEmpty => readClasses().isEmpty;

  int get length => readClasses().length;

  dynamic reduce(dynamic initialValue,
      dynamic combine(dynamic previousValue, String element)) {
    return readClasses().reduce(initialValue, combine);
  }
  // interface Collection - END

  // interface Set - BEGIN
  bool contains(String value) => readClasses().contains(value);

  void add(String value) {
    // TODO - figure out if we need to do any validation here
    // or if the browser natively does enough.
    _modify((s) => s.add(value));
  }

  bool remove(Object value) {
    if (value is! String) return false;
    Set<String> s = readClasses();
    bool result = s.remove(value);
    writeClasses(s);
    return result;
  }

  void addAll(Iterable<String> iterable) {
    // TODO - see comment above about validation.
    _modify((s) => s.addAll(iterable));
  }

  void removeAll(Iterable<String> iterable) {
    _modify((s) => s.removeAll(iterable));
  }

  void retainAll(Iterable<String> iterable) {
    _modify((s) => s.retainAll(iterable));
  }

  void removeWhere(bool test(String name)) {
    _modify((s) => s.removeWhere(test));
  }

  void retainWhere(bool test(String name)) {
    _modify((s) => s.retainWhere(test));
  }

  bool isSubsetOf(Collection<String> collection) =>
    readClasses().isSubsetOf(collection);

  bool containsAll(Iterable<String> collection) =>
    readClasses().containsAll(collection);

  Set<String> intersection(Set<String> other) =>
    readClasses().intersection(other);

  Set<String> union(Set<String> other) =>
    readClasses().union(other);

  Set<String> difference(Set<String> other) =>
    readClasses().difference(other);

  String get first => readClasses().first;
  String get last => readClasses().last;
  String get single => readClasses().single;
  List<String> toList({ bool growable: true }) =>
      readClasses().toList(growable: growable);
  Set<String> toSet() => readClasses().toSet();
  String min([int compare(String a, String b)]) =>
      readClasses().min(compare);
  String max([int compare(String a, String b)]) =>
      readClasses().max(compare);
  Iterable<String> take(int n) => readClasses().take(n);
  Iterable<String> takeWhile(bool test(String value)) =>
      readClasses().takeWhile(test);
  Iterable<String> skip(int n) => readClasses().skip(n);
  Iterable<String> skipWhile(bool test(String value)) =>
      readClasses().skipWhile(test);
  String firstWhere(bool test(String value), { String orElse() }) =>
      readClasses().firstWhere(test, orElse: orElse);
  String lastWhere(bool test(String value), {String orElse()}) =>
      readClasses().lastWhere(test, orElse: orElse);
  String singleWhere(bool test(String value)) =>
      readClasses().singleWhere(test);
  String elementAt(int index) => readClasses().elementAt(index);

  void clear() {
    _modify((s) => s.clear());
  }
  // interface Set - END

  /**
   * 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.
   */
  void _modify( f(Set<String> s)) {
    Set<String> s = readClasses();
    f(s);
    writeClasses(s);
  }

  /**
   * Read the class names from the Element class property,
   * and put them into a set (duplicates are discarded).
   * This is intended to be overridden by specific implementations.
   */
  Set<String> readClasses();

  /**
   * Join all the elements of a set into one string and write
   * back to the element.
   * This is intended to be overridden by specific implementations.
   */
  void writeClasses(Set<String> s);
}
// 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 void 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.


/**
 * 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() => this;
  bool get isBroadcast => true;

  StreamSubscription<T> listen(void onData(T event),
      { void onError(AsyncError error),
      void onDone(),
      bool unsubscribeOnError}) {

    return new _EventStreamSubscription<T>(
        this._target, this._eventType, onData, this._useCapture);
  }
}

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, this._onData,
      this._useCapture) {
    _tryResume();
  }

  void cancel() {
    if (_canceled) {
      throw new StateError("Subscription has been canceled.");
    }

    _unlisten();
    // Clear out the target to indicate this is complete.
    _target = null;
    _onData = 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 = handleData;
    _tryResume();
  }

  /// Has no effect.
  void onError(void handleError(AsyncError error)) {}

  /// Has no effect.
  void onDone(void handleDone()) {}

  void pause([Future resumeSignal]) {
    if (_canceled) {
      throw new StateError("Subscription has been canceled.");
    }
    ++_pauseCount;
    _unlisten();

    if (resumeSignal != null) {
      resumeSignal.whenComplete(resume);
    }
  }

  bool get _paused => _pauseCount > 0;

  void resume() {
    if (_canceled) {
      throw new StateError("Subscription has been canceled.");
    }
    if (!_paused) {
      throw new StateError("Subscription is not paused.");
    }
    --_pauseCount;
    _tryResume();
  }

  void _tryResume() {
    if (_onData != null && !_paused) {
      _target.$dom_addEventListener(_eventType, _onData, _useCapture);
    }
  }

  void _unlisten() {
    if (_onData != null) {
      _target.$dom_removeEventListener(_eventType, _onData, _useCapture);
    }
  }
}


/**
 * 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 may be used to capture DOM events:
   *
   *     Element.keyDownEvent.forTarget(element, useCapture: true).listen(...);
   *
   * 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}) {
    return new _EventStream(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 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);
  }

  String getEventType(EventTarget target) {
    return _eventTypeGetter(target);
  }
}
// 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.


/**
 * Works with KeyboardEvent and KeyEvent to determine how to expose information
 * about Key(board)Events. This class functions like an EventListenerList, and
 * provides a consistent interface for the Dart
 * user, despite the fact that a multitude of browsers that have varying
 * keyboard default behavior.
 *
 * 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 KeyboardEventController {
  // 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.
   */
  List<KeyboardEvent> _keyDownList;

  /** The set of functions that wish to be notified when a KeyEvent happens. */
  List<Function> _callbacks;

  /** The type of KeyEvent we are tracking (keyup, keydown, keypress). */
  String _type;

  /** The element we are watching for events to happen on. */
  EventTarget _target;

  // The distance to shift from upper case alphabet Roman letters to lower case.
  final int _ROMAN_ALPHABET_OFFSET = "a".codeUnits[0] - "A".codeUnits[0];

  StreamSubscription _keyUpSubscription, _keyDownSubscription,
      _keyPressSubscription;

  /**
   * 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 Map<String, int> _keyIdentifier = {
    '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
  };

  /** Named constructor to add an onKeyPress event listener to our handler. */
  KeyboardEventController.keypress(EventTarget target) {
    _KeyboardEventController(target, 'keypress');
  }

  /** Named constructor to add an onKeyUp event listener to our handler. */
  KeyboardEventController.keyup(EventTarget target) {
    _KeyboardEventController(target, 'keyup');
  }

  /** Named constructor to add an onKeyDown event listener to our handler. */
  KeyboardEventController.keydown(EventTarget target) {
    _KeyboardEventController(target, 'keydown');
  }

  /**
   * General constructor, performs basic initialization for our improved
   * KeyboardEvent controller.
   */
  _KeyboardEventController(EventTarget target, String type) {
    _callbacks = [];
    _type = type;
    _target = target;
  }

  /**
   * Hook up all event listeners under the covers so we can estimate keycodes
   * and charcodes when they are not provided.
   */
  void _initializeAllEventListeners() {
    _keyDownList = [];
    if (_keyDownSubscription == null) {
      _keyDownSubscription = Element.keyDownEvent.forTarget(
          _target, useCapture: true).listen(processKeyDown);
      _keyPressSubscription = Element.keyPressEvent.forTarget(
          _target, useCapture: true).listen(processKeyUp);
      _keyUpSubscription = Element.keyUpEvent.forTarget(
          _target, useCapture: true).listen(processKeyPress);
    }
  }

  /** Add a callback that wishes to be notified when a KeyEvent occurs. */
  void add(void callback(KeyEvent)) {
    if (_callbacks.length == 0) {
      _initializeAllEventListeners();
    }
    _callbacks.add(callback);
  }

  /**
   * Notify all callback listeners that a KeyEvent of the relevant type has
   * occurred.
   */
  bool _dispatch(KeyEvent event) {
    if (event.type == _type) {
      // Make a copy of the listeners in case a callback gets removed while
      // dispatching from the list.
      List callbacksCopy = new List.from(_callbacks);
      for(var callback in callbacksCopy) {
        callback(event);
      }
    }
  }

  /** Remove the given callback from the listeners list. */
  void remove(void callback(KeyEvent)) {
    var index = _callbacks.indexOf(callback);
    if (index != -1) {
      _callbacks.removeAt(index);
    }
    if (_callbacks.length == 0) {
      // If we have no listeners, don't bother keeping track of keypresses.
      _keyDownSubscription.cancel();
      _keyDownSubscription = null;
      _keyPressSubscription.cancel();
      _keyPressSubscription = null;
      _keyUpSubscription.cancel();
      _keyUpSubscription = null;
    }
  }

  /** 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 = [];
    }

    var event = new KeyEvent(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(event);
    }
    _keyDownList.add(event);
    _dispatch(event);
  }

  /** Handle keypress events. */
  void processKeyPress(KeyboardEvent event) {
    var e = new KeyEvent(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);
    _dispatch(e);
  }

  /** Handle keyup events. */
  void processKeyUp(KeyboardEvent event) {
    var e = new KeyEvent(event);
    KeyboardEvent toRemove = null;
    for (var key in _keyDownList) {
      if (key.keyCode == e.keyCode) {
        toRemove = key;
      }
    }
    if (toRemove != null) {
      _keyDownList =
          _keyDownList.where((element) => element != toRemove).toList();
    } 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();
    }
    _dispatch(e);
  }
}
// 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);
  }
}
// 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 KeyEvent.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) 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 _ModelTreeObserver {
  static bool _initialized = false;

  /**
   * Start an observer watching the document for tree changes to automatically
   * propagate model changes.
   *
   * Currently this does not support propagation through Shadow DOMs.
   */
  static void initialize() {
    if (!_initialized) {
      _initialized = true;

      if (MutationObserver.supported) {
        var observer = new MutationObserver(_processTreeChange);
        observer.observe(document, childList: true, subtree: true);
      } else {
        document.on['DOMNodeInserted'].listen(_handleNodeInserted);
        document.on['DOMNodeRemoved'].listen(_handleNodeRemoved);
      }
    }
  }

  static void _processTreeChange(List<MutationRecord> mutations,
      MutationObserver observer) {
    for (var record in mutations) {
      for (var node in record.addedNodes) {
        // When nodes enter the document we need to make sure that all of the
        // models are properly propagated through the entire sub-tree.
        propagateModel(node, _calculatedModel(node), true);
      }
      for (var node in record.removedNodes) {
        propagateModel(node, _calculatedModel(node), false);
      }
    }
  }

  static void _handleNodeInserted(MutationEvent e) {
    var node = e.target;
    window.setImmediate(() {
      propagateModel(node, _calculatedModel(node), true);
    });
  }

  static void _handleNodeRemoved(MutationEvent e) {
    var node = e.target;
    window.setImmediate(() {
      propagateModel(node, _calculatedModel(node), false);
    });
  }

  /**
   * Figures out what the model should be for a node, avoiding any cached
   * model values.
   */
  static _calculatedModel(node) {
    if (node._hasLocalModel == true) {
      return node._model;
    } else if (node.parentNode != null) {
      return node.parentNode._model;
    }
    return null;
  }

  /**
   * Pushes model changes down through the tree.
   *
   * Set fullTree to true if the state of the tree is unknown and model changes
   * should be propagated through the entire tree.
   */
  static void propagateModel(Node node, model, bool fullTree) {
    // Calling into user code with the != call could generate exceptions.
    // Catch and report them a global exceptions.
    try {
      if (node._hasLocalModel != true && node._model != model &&
          node._modelChangedStream != null) {
        node._model = model;
        node._modelChangedStream.add(node);
      }
    } on AsyncError catch (e) {
      e.throwDelayed();
    } catch (e, s) {
      new AsyncError(e, s).throwDelayed();
    }
    for (var child = node.$dom_firstChild; child != null;
        child = child.nextNode) {
      if (child._hasLocalModel != true) {
        propagateModel(child, model, fullTree);
      } else if (fullTree) {
        propagateModel(child, child._model, true);
      }
    }
  }
}
// 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 utility class for representing two-dimensional positions.
 */
class Point {
  final num x;
  final num y;

  const Point([num x = 0, num y = 0]): x = x, y = y;

  String toString() => '($x, $y)';

  bool operator ==(other) {
    if (other is !Point) return false;
    return x == other.x && y == other.y;
  }

  Point operator +(Point other) {
    return new Point(x + other.x, y + other.y);
  }

  Point operator -(Point other) {
    return new Point(x - other.x, y - other.y);
  }

  Point operator *(num factor) {
    return new Point(x * factor, y * factor);
  }

  /**
   * Returns the distance between two points.
   */
  double distanceTo(Point other) {
    var dx = x - other.x;
    var dy = y - other.y;
    return sqrt(dx * dx + dy * dy);
  }

  /**
   * Returns the squared distance between two points.
   *
   * Squared distances can be used for comparisons when the actual value is not
   * required.
   */
  num squaredDistanceTo(Point other) {
    var dx = x - other.x;
    var dy = y - other.y;
    return dx * dx + dy * dy;
  }

  Point ceil() => new Point(x.ceil(), y.ceil());
  Point floor() => new Point(x.floor(), y.floor());
  Point round() => new Point(x.round(), y.round());

  /**
   * Truncates x and y to integers and returns the result as a new point.
   */
  Point toInt() => new Point(x.toInt(), y.toInt());
}
// 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 class for representing two-dimensional rectangles.
 */
class Rect {
  final num left;
  final num top;
  final num width;
  final num height;

  const Rect(this.left, this.top, this.width, this.height);

  factory Rect.fromPoints(Point a, Point b) {
    var left;
    var width;
    if (a.x < b.x) {
      left = a.x;
      width = b.x - left;
    } else {
      left = b.x;
      width = a.x - left;
    }
    var top;
    var height;
    if (a.y < b.y) {
      top = a.y;
      height = b.y - top;
    } else {
      top = b.y;
      height = a.y - top;
    }

    return new Rect(left, top, width, height);
  }

  num get right => left + width;
  num get bottom => top + height;

  // NOTE! All code below should be common with Rect.
  // TODO: implement with mixins when available.

  String toString() {
    return '($left, $top, $width, $height)';
  }

  bool operator ==(other) {
    if (other is !Rect) return false;
    return left == other.left && top == other.top && width == other.width &&
        height == other.height;
  }

  /**
   * Computes the intersection of this rectangle and the rectangle parameter.
   * Returns null if there is no intersection.
   */
  Rect intersection(Rect rect) {
    var x0 = max(left, rect.left);
    var x1 = min(left + width, rect.left + rect.width);

    if (x0 <= x1) {
      var y0 = max(top, rect.top);
      var y1 = min(top + height, rect.top + rect.height);

      if (y0 <= y1) {
        return new Rect(x0, y0, x1 - x0, y1 - y0);
      }
    }
    return null;
  }


  /**
   * Returns whether a rectangle intersects this rectangle.
   */
  bool intersects(Rect 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 rectangle and the
   * input rectangle.
   */
  Rect union(Rect rect) {
    var right = max(this.left + this.width, rect.left + rect.width);
    var bottom = max(this.top + this.height, rect.top + rect.height);

    var left = min(this.left, rect.left);
    var top = min(this.top, rect.top);

    return new Rect(left, top, right - left, bottom - top);
  }

  /**
   * Tests whether this rectangle entirely contains another rectangle.
   */
  bool containsRect(Rect another) {
    return left <= another.left &&
           left + width >= another.left + another.width &&
           top <= another.top &&
           top + height >= another.top + another.height;
  }

  /**
   * Tests whether this rectangle entirely contains a point.
   */
  bool containsPoint(Point another) {
    return another.x >= left &&
           another.x <= left + width &&
           another.y >= top &&
           another.y <= top + height;
  }

  Rect ceil() => new Rect(left.ceil(), top.ceil(), width.ceil(), height.ceil());
  Rect floor() => new Rect(left.floor(), top.floor(), width.floor(),
      height.floor());
  Rect round() => new Rect(left.round(), top.round(), width.round(),
      height.round());

  /**
   * Truncates coordinates to integers and returns the result as a new
   * rectangle.
   */
  Rect toInt() => new Rect(left.toInt(), top.toInt(), width.toInt(),
      height.toInt());

  Point get topLeft => new Point(this.left, this.top);
  Point get bottomRight => new Point(this.left + this.width,
      this.top + this.height);
}
// 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(antonm): support not DOM isolates too.
class _Timer implements Timer {
  final canceller;

  _Timer(this.canceller);

  void cancel() { canceller(); }
}

get _timerFactoryClosure => (int milliSeconds, void callback(Timer timer), bool repeating) {
  var maker;
  var canceller;
  if (repeating) {
    maker = window._setInterval;
    canceller = window._clearInterval;
  } else {
    maker = window._setTimeout;
    canceller = window._clearTimeout;
  }
  Timer timer;
  final int id = maker(() { callback(timer); }, milliSeconds);
  timer = new _Timer(() { canceller(id); });
  return timer;
};
// 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> implements List<E> {
  final List _list;

  _WrappedList(this._list);

  // Iterable APIs

  Iterator<E> get iterator => new _WrappedIterator(_list.iterator);

  Iterable map(f(E element)) => _list.map(f);

  Iterable<E> where(bool f(E element)) => _list.where(f);

  Iterable expand(Iterable f(E element)) => _list.expand(f);

  bool contains(E element) => _list.contains(element);

  void forEach(void f(E element)) { _list.forEach(f); }

  dynamic reduce(initialValue, combine(previousValue, E element)) =>
      _list.reduce(initialValue, combine);

  bool every(bool f(E element)) => _list.every(f);

  String join([String separator]) => _list.join(separator);

  bool any(bool f(E element)) => _list.any(f);

  List<E> toList({ bool growable: true }) =>
      new List.from(_list, growable: growable);

  Set<E> toSet() => _list.toSet();

  int get length => _list.length;

  E min([int compare(E a, E b)]) => _list.min(compare);

  E max([int compare(E a, E b)]) => _list.max(compare);

  bool get isEmpty => _list.isEmpty;

  Iterable<E> take(int n) => _list.take(n);

  Iterable<E> takeWhile(bool test(E value)) => _list.takeWhile(test);

  Iterable<E> skip(int n) => _list.skip(n);

  Iterable<E> skipWhile(bool test(E value)) => _list.skipWhile(test);

  E get first => _list.first;

  E get last => _list.last;

  E get single => _list.single;

  E firstWhere(bool test(E value), { E orElse() }) =>
      _list.firstWhere(test, orElse: orElse);

  E lastWhere(bool test(E value), {E orElse()}) =>
      _list.lastWhere(test, orElse: orElse);

  E singleWhere(bool test(E value)) => _list.singleWhere(test);

  E elementAt(int index) => _list.elementAt(index);

  // Collection APIs

  void add(E element) { _list.add(element); }

  void addAll(Iterable<E> elements) { _list.addAll(elements); }

  void remove(Object element) { _list.remove(element); }

  void removeAll(Iterable elements) { _list.removeAll(elements); }

  void retainAll(Iterable elements) { _list.retainAll(elements); }

  void removeWhere(bool test(E element)) { _list.removeWhere(test); }

  void retainWhere(bool test(E element)) { _list.retainWhere(test); }

  void clear() { _list.clear(); }

  // List APIs

  E operator [](int index) => _list[index];

  void operator []=(int index, E value) { _list[index] = value; }

  void set length(int newLength) { _list.length = newLength; }

  void addLast(E value) { _list.add(value); }

  Iterable<E> get reversed => _list.reversed;

  void sort([int compare(E a, E b)]) { _list.sort(compare); }

  int indexOf(E element, [int start = 0]) => _list.indexOf(element, start);

  int lastIndexOf(E element, [int start]) => _list.lastIndexOf(element, start);

  void insert(int index, E element) => _list.insert(index, element);

  E removeAt(int index) => _list.removeAt(index);

  E removeLast() => _list.removeLast();

  List<E> sublist(int start, [int end]) => _list.sublist(start, end);

  List<E> getRange(int start, int length) => sublist(start, start + length);

  void setRange(int start, int length, List<E> from, [int startFrom]) {
    _list.setRange(start, length, from, startFrom);
  }

  void removeRange(int start, int length) { _list.removeRange(start, length); }

  void insertRange(int start, int length, [E fill]) {
    _list.insertRange(start, length, fill);
  }

  Map<int, E> asMap() => IterableMixinWorkaround.asMapList(_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, true);

    request.withCredentials = withCredentials;

    request.onReadyStateChange.listen((e) {
      if (request.readyState == HttpRequest.DONE) {
        onComplete(request);
      }
    });

    request.send();

    return request;
  }
}
// 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 _CssStyleDeclarationFactoryProvider {
  static CssStyleDeclaration createCssStyleDeclaration_css(String css) {
    final style = new Element.tag('div').style;
    style.cssText = css;
    return style;
  }

  static CssStyleDeclaration createCssStyleDeclaration() {
    return new CssStyleDeclaration.css('');
  }
}

class _DocumentFragmentFactoryProvider {
  @DomName('Document.createDocumentFragment')
  static DocumentFragment createDocumentFragment() =>
      document.createDocumentFragment();

  static DocumentFragment createDocumentFragment_html(String html) {
    final fragment = new DocumentFragment();
    fragment.innerHtml = html;
    return fragment;
  }

  // TODO(nweiz): enable this when XML is ported.
  // factory DocumentFragment.xml(String xml) {
  //   final fragment = new DocumentFragment();
  //   final e = new XMLElement.tag("xml");
  //   e.innerHtml = xml;
  //
  //   // Copy list first since we don't want liveness during iteration.
  //   final List nodes = new List.from(e.nodes);
  //   fragment.nodes.addAll(nodes);
  //   return fragment;
  // }

  static DocumentFragment createDocumentFragment_svg(String svgContent) {
    final fragment = new DocumentFragment();
    final e = new svg.SvgSvgElement();
    e.innerHtml = svgContent;

    // Copy list first since we don't want liveness during iteration.
    final List nodes = new List.from(e.nodes);
    fragment.nodes.addAll(nodes);
    return fragment;
  }
}
/**
 * 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).
 *
 * 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 KeyEvent 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 => _parent.keyCode;

  /** Accessor to the underlying charCode value is the parent event. */
  int get _realCharCode => _parent.charCode;

  /** Accessor to the underlying altKey value is the parent event. */
  bool get _realAltKey => _parent.altKey;

  /** Construct a KeyEvent with [parent] as event we're emulating. */
  KeyEvent(KeyboardEvent parent) {
    _parent = parent;
    _shadowAltKey = _realAltKey;
    _shadowCharCode = _realCharCode;
    _shadowKeyCode = _realKeyCode;
  }

  /** True if the altGraphKey is pressed during this event. */
  bool get altGraphKey => _parent.altGraphKey;
  bool get bubbles => _parent.bubbles;
  /** True if this event can be cancelled. */
  bool get cancelable => _parent.cancelable;
  bool get cancelBubble => _parent.cancelBubble;
  void set cancelBubble(bool cancel) {
    _parent.cancelBubble = cancel;
  }
  /** 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;
  /** Accessor to the target this event is listening to for changes. */
  EventTarget get currentTarget => _parent.currentTarget;
  bool get defaultPrevented => _parent.defaultPrevented;
  int get detail => _parent.detail;
  int get eventPhase => _parent.eventPhase;
  /**
   * 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;
  bool get returnValue => _parent.returnValue;
  void set returnValue(bool value) {
    _parent.returnValue = value;
  }
  /** True if the shift key was pressed during this event. */
  bool get shiftKey => _parent.shiftKey;
  int get timeStamp => _parent.timeStamp;
  /**
   * The type of key event that occurred. One of "keydown", "keyup", or
   * "keypress".
   */
  String get type => _parent.type;
  Window get view => _parent.view;
  void preventDefault() => _parent.preventDefault();
  void stopImmediatePropagation() => _parent.stopImmediatePropagation();
  void stopPropagation() => _parent.stopPropagation();
  void $dom_initUIEvent(String type, bool canBubble, bool cancelable,
      Window view, int detail) {
    throw new UnsupportedError("Cannot initialize a UI Event from a KeyEvent.");
  }
  void $dom_initEvent(String eventTypeArg, bool canBubbleArg,
      bool cancelableArg) {
    throw new UnsupportedError("Cannot initialize an Event from a KeyEvent.");
  }
  String get _shadowKeyIdentifier => _parent.$dom_keyIdentifier;

  int get $dom_charCode => charCode;
  int get $dom_keyCode => keyCode;
  EventTarget get target => _parent.target;
  String get $dom_keyIdentifier {
    throw new UnsupportedError("keyIdentifier is unsupported.");
  }
  void $dom_initKeyboardEvent(String type, bool canBubble, bool cancelable,
      Window view, String keyIdentifier, int keyLocation, bool ctrlKey,
      bool altKey, bool shiftKey, bool metaKey,
      bool altGraphKey) {
    throw new UnsupportedError(
        "Cannot initialize a KeyboardEvent from a KeyEvent.");
  }
}
// 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 _TypedArrayFactoryProvider {
  static Float32Array createFloat32Array(int length) => _F32(length);
  static Float32Array createFloat32Array_fromList(List<num> list) =>
      _F32(ensureNative(list));
  static Float32Array createFloat32Array_fromBuffer(ArrayBuffer buffer,
      [int byteOffset = 0, int length]) => _F32(buffer, byteOffset, length);
  static _F32(arg0, [arg1, arg2]) native "Float32Array_constructor_Callback";

  static Float64Array createFloat64Array(int length) => _F64(length);
  static Float64Array createFloat64Array_fromList(List<num> list) =>
      _F64(ensureNative(list));
  static Float64Array createFloat64Array_fromBuffer(ArrayBuffer buffer,
      [int byteOffset = 0, int length]) => _F64(buffer, byteOffset, length);
  static _F64(arg0, [arg1, arg2]) native "Float64Array_constructor_Callback";

  static Int8Array createInt8Array(int length) => _I8(length);
  static Int8Array createInt8Array_fromList(List<num> list) =>
      _I8(ensureNative(list));
  static Int8Array createInt8Array_fromBuffer(ArrayBuffer buffer,
      [int byteOffset = 0, int length]) => _I8(buffer, byteOffset, length);
  static _I8(arg0, [arg1, arg2]) native "Int8Array_constructor_Callback";

  static Int16Array createInt16Array(int length) => _I16(length);
  static Int16Array createInt16Array_fromList(List<num> list) =>
      _I16(ensureNative(list));
  static Int16Array createInt16Array_fromBuffer(ArrayBuffer buffer,
      [int byteOffset = 0, int length]) => _I16(buffer, byteOffset, length);
  static _I16(arg0, [arg1, arg2]) native "Int16Array_constructor_Callback";

  static Int32Array createInt32Array(int length) => _I32(length);
  static Int32Array createInt32Array_fromList(List<num> list) =>
      _I32(ensureNative(list));
  static Int32Array createInt32Array_fromBuffer(ArrayBuffer buffer,
      [int byteOffset = 0, int length]) => _I32(buffer, byteOffset, length);
  static _I32(arg0, [arg1, arg2]) native "Int32Array_constructor_Callback";

  static Uint8Array createUint8Array(int length) => _U8(length);
  static Uint8Array createUint8Array_fromList(List<num> list) =>
      _U8(ensureNative(list));
  static Uint8Array createUint8Array_fromBuffer(ArrayBuffer buffer,
      [int byteOffset = 0, int length]) => _U8(buffer, byteOffset, length);
  static _U8(arg0, [arg1, arg2]) native "Uint8Array_constructor_Callback";

  static Uint16Array createUint16Array(int length) => _U16(length);
  static Uint16Array createUint16Array_fromList(List<num> list) =>
      _U16(ensureNative(list));
  static Uint16Array createUint16Array_fromBuffer(ArrayBuffer buffer,
      [int byteOffset = 0, int length]) => _U16(buffer, byteOffset, length);
  static _U16(arg0, [arg1, arg2]) native "Uint16Array_constructor_Callback";

  static Uint32Array createUint32Array(int length) => _U32(length);
  static Uint32Array createUint32Array_fromList(List<num> list) =>
      _U32(ensureNative(list));
  static Uint32Array createUint32Array_fromBuffer(ArrayBuffer buffer,
      [int byteOffset = 0, int length]) => _U32(buffer, byteOffset, length);
  static _U32(arg0, [arg1, arg2]) native "Uint32Array_constructor_Callback";

  static Uint8ClampedArray createUint8ClampedArray(int length) => _U8C(length);
  static Uint8ClampedArray createUint8ClampedArray_fromList(
      List<num> list) => _U8C(ensureNative(list));
  static Uint8ClampedArray createUint8ClampedArray_fromBuffer(
      ArrayBuffer buffer, [int byteOffset = 0, int length]) =>
      _U8C(buffer, byteOffset, length);
  static _U8C(arg0, [arg1, arg2]) native "Uint8ClampedArray_constructor_Callback";

  static ensureNative(List list) => list;  // TODO: make sure.
}

class _TextFactoryProvider {
  static Text createText(String data) => document.$dom_createTextNode(data);
}
// 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.


_serialize(var message) {
  return new _JsSerializer().traverse(message);
}

class _JsSerializer extends _Serializer {

  visitSendPortSync(SendPortSync x) {
    if (x is _JsSendPortSync) return visitJsSendPortSync(x);
    if (x is _LocalSendPortSync) return visitLocalSendPortSync(x);
    if (x is _RemoteSendPortSync) return visitRemoteSendPortSync(x);
    throw "Unknown port type $x";
  }

  visitJsSendPortSync(_JsSendPortSync x) {
    return [ 'sendport', 'nativejs', x._id ];
  }

  visitLocalSendPortSync(_LocalSendPortSync x) {
    return [ 'sendport', 'dart',
             ReceivePortSync._isolateId, x._receivePort._portId ];
  }

  visitSendPort(SendPort x) {
    throw new UnimplementedError('Asynchronous send port not yet implemented.');
  }

  visitRemoteSendPortSync(_RemoteSendPortSync x) {
    return [ 'sendport', 'dart', x._isolateId, x._portId ];
  }
}

_deserialize(var message) {
  return new _JsDeserializer().deserialize(message);
}


class _JsDeserializer extends _Deserializer {

  static const _UNSPECIFIED = const Object();

  deserializeSendPort(List x) {
    String tag = x[1];
    switch (tag) {
      case 'nativejs':
        num id = x[2];
        return new _JsSendPortSync(id);
      case 'dart':
        num isolateId = x[2];
        num portId = x[3];
        return ReceivePortSync._lookup(isolateId, portId);
      default:
        throw 'Illegal SendPortSync type: $tag';
    }
  }
}

// The receiver is JS.
class _JsSendPortSync implements SendPortSync {

  num _id;
  _JsSendPortSync(this._id);

  callSync(var message) {
    var serialized = _serialize(message);
    var result = _callPortSync(_id, serialized);
    return _deserialize(result);
  }

  bool operator==(var other) {
    return (other is _JsSendPortSync) && (_id == other._id);
  }

  int get hashCode => _id;
}

// TODO(vsm): Differentiate between Dart2Js and Dartium isolates.
// The receiver is a different Dart isolate, compiled to JS.
class _RemoteSendPortSync implements SendPortSync {

  int _isolateId;
  int _portId;
  _RemoteSendPortSync(this._isolateId, this._portId);

  callSync(var message) {
    var serialized = _serialize(message);
    var result = _call(_isolateId, _portId, serialized);
    return _deserialize(result);
  }

  static _call(int isolateId, int portId, var message) {
    var target = 'dart-port-$isolateId-$portId';
    // TODO(vsm): Make this re-entrant.
    // TODO(vsm): Set this up set once, on the first call.
    var source = '$target-result';
    var result = null;
    window.on[source].first.then((Event e) {
      result = json.parse(_getPortSyncEventData(e));
    });
    _dispatchEvent(target, [source, message]);
    return result;
  }

  bool operator==(var other) {
    return (other is _RemoteSendPortSync) && (_isolateId == other._isolateId)
      && (_portId == other._portId);
  }

  int get hashCode => _isolateId >> 16 + _portId;
}

// The receiver is in the same Dart isolate, compiled to JS.
class _LocalSendPortSync implements SendPortSync {

  ReceivePortSync _receivePort;

  _LocalSendPortSync._internal(this._receivePort);

  callSync(var message) {
    // TODO(vsm): Do a more efficient deep copy.
    var copy = _deserialize(_serialize(message));
    var result = _receivePort._callback(copy);
    return _deserialize(_serialize(result));
  }

  bool operator==(var other) {
    return (other is _LocalSendPortSync)
      && (_receivePort == other._receivePort);
  }

  int get hashCode => _receivePort.hashCode;
}

// TODO(vsm): Move this to dart:isolate.  This will take some
// refactoring as there are dependences here on the DOM.  Users
// interact with this class (or interface if we change it) directly -
// new ReceivePortSync.  I think most of the DOM logic could be
// delayed until the corresponding SendPort is registered on the
// window.

// A Dart ReceivePortSync (tagged 'dart' when serialized) is
// identifiable / resolvable by the combination of its isolateid and
// portid.  When a corresponding SendPort is used within the same
// isolate, the _portMap below can be used to obtain the
// ReceivePortSync directly.  Across isolates (or from JS), an
// EventListener can be used to communicate with the port indirectly.
class ReceivePortSync {

  static Map<int, ReceivePortSync> _portMap;
  static int _portIdCount;
  static int _cachedIsolateId;

  num _portId;
  Function _callback;
  StreamSubscription _portSubscription;

  ReceivePortSync() {
    if (_portIdCount == null) {
      _portIdCount = 0;
      _portMap = new Map<int, ReceivePortSync>();
    }
    _portId = _portIdCount++;
    _portMap[_portId] = this;
  }

  static int get _isolateId {
    // TODO(vsm): Make this coherent with existing isolate code.
    if (_cachedIsolateId == null) {
      _cachedIsolateId = _getNewIsolateId();
    }
    return _cachedIsolateId;
  }

  static String _getListenerName(isolateId, portId) =>
      'dart-port-$isolateId-$portId';
  String get _listenerName => _getListenerName(_isolateId, _portId);

  void receive(callback(var message)) {
    _callback = callback;
    if (_portSubscription == null) {
      _portSubscription = window.on[_listenerName].listen((Event e) {
        var data = json.parse(_getPortSyncEventData(e));
        var replyTo = data[0];
        var message = _deserialize(data[1]);
        var result = _callback(message);
        _dispatchEvent(replyTo, _serialize(result));
      });
    }
  }

  void close() {
    _portMap.remove(_portId);
    if (_portSubscription != null) _portSubscription.cancel();
  }

  SendPortSync toSendPort() {
    return new _LocalSendPortSync._internal(this);
  }

  static SendPortSync _lookup(int isolateId, int portId) {
    if (isolateId == _isolateId) {
      return _portMap[portId].toSendPort();
    } else {
      return new _RemoteSendPortSync(isolateId, portId);
    }
  }
}

get _isolateId => ReceivePortSync._isolateId;

void _dispatchEvent(String receiver, var message) {
  var event = new CustomEvent(receiver, canBubble: false, cancelable:false,
    detail: json.stringify(message));
  window.dispatchEvent(event);
}

String _getPortSyncEventData(CustomEvent event) => event.detail;
// 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.


typedef void _MicrotaskCallback();

/**
 * This class attempts to invoke a callback as soon as the current event stack
 * unwinds, but before the browser repaints.
 */
abstract class _MicrotaskScheduler {
  bool _nextMicrotaskFrameScheduled = false;
  _MicrotaskCallback _callback;

  _MicrotaskScheduler(this._callback);

  /**
   * Creates the best possible microtask scheduler for the current platform.
   */
  factory _MicrotaskScheduler.best(_MicrotaskCallback callback) {
    if (Window._supportsSetImmediate) {
      return new _SetImmediateScheduler(callback);
    } else if (MutationObserver.supported) {
      return new _MutationObserverScheduler(callback);
    }
    return new _PostMessageScheduler(callback);
  }

  /**
   * Schedules a microtask callback if one has not been scheduled already.
   */
  void maybeSchedule() {
    if (this._nextMicrotaskFrameScheduled) {
      return;
    }
    this._nextMicrotaskFrameScheduled = true;
    this._schedule();
  }

  /**
   * Does the actual scheduling of the callback.
   */
  void _schedule();

  /**
   * Handles the microtask callback and forwards it if necessary.
   */
  void _onCallback() {
    // Ignore spurious messages.
    if (!_nextMicrotaskFrameScheduled) {
      return;
    }
    _nextMicrotaskFrameScheduled = false;
    this._callback();
  }
}

/**
 * Scheduler which uses window.postMessage to schedule events.
 */
class _PostMessageScheduler extends _MicrotaskScheduler {
  const _MICROTASK_MESSAGE = "DART-MICROTASK";

  _PostMessageScheduler(_MicrotaskCallback callback): super(callback) {
      // Messages from other windows do not cause a security risk as
      // all we care about is that _handleMessage is called
      // after the current event loop is unwound and calling the function is
      // a noop when zero requests are pending.
      window.onMessage.listen(this._handleMessage);
  }

  void _schedule() {
    window.postMessage(_MICROTASK_MESSAGE, "*");
  }

  void _handleMessage(e) {
    this._onCallback();
  }
}

/**
 * Scheduler which uses a MutationObserver to schedule events.
 */
class _MutationObserverScheduler extends _MicrotaskScheduler {
  MutationObserver _observer;
  Element _dummy;

  _MutationObserverScheduler(_MicrotaskCallback callback): super(callback) {
    // Mutation events get fired as soon as the current event stack is unwound
    // so we just make a dummy event and listen for that.
    _observer = new MutationObserver(this._handleMutation);
    _dummy = new DivElement();
    _observer.observe(_dummy, attributes: true);
  }

  void _schedule() {
    // Toggle it to trigger the mutation event.
    _dummy.hidden = !_dummy.hidden;
  }

  _handleMutation(List<MutationRecord> mutations, MutationObserver observer) {
    this._onCallback();
  }
}

/**
 * Scheduler which uses window.setImmediate to schedule events.
 */
class _SetImmediateScheduler extends _MicrotaskScheduler {
  _SetImmediateScheduler(_MicrotaskCallback callback): super(callback);

  void _schedule() {
    window._setImmediate(_handleImmediate);
  }

  void _handleImmediate() {
    this._onCallback();
  }
}

List<TimeoutHandler> _pendingMicrotasks;
_MicrotaskScheduler _microtaskScheduler = null;

void _maybeScheduleMicrotaskFrame() {
  if (_microtaskScheduler == null) {
    _microtaskScheduler =
      new _MicrotaskScheduler.best(_completeMicrotasks);
  }
  _microtaskScheduler.maybeSchedule();
}

/**
 * Registers a [callback] which is called after the current execution stack
 * unwinds.
 */
void _addMicrotaskCallback(TimeoutHandler callback) {
  if (_pendingMicrotasks == null) {
    _pendingMicrotasks = <TimeoutHandler>[];
    _maybeScheduleMicrotaskFrame();
  }
  _pendingMicrotasks.add(callback);
}


/**
 * Complete all pending microtasks.
 */
void _completeMicrotasks() {
  var callbacks = _pendingMicrotasks;
  _pendingMicrotasks = null;
  for (var callback in callbacks) {
    callback();
  }
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// Patch file for the dart:isolate library.


/********************************************************
  Inserted from lib/isolate/serialization.dart
 ********************************************************/

class _MessageTraverserVisitedMap {

  operator[](var object) => null;
  void operator[]=(var object, var info) { }

  void reset() { }
  void cleanup() { }

}

/** Abstract visitor for dart objects that can be sent as isolate messages. */
abstract class _MessageTraverser {

  _MessageTraverserVisitedMap _visited;
  _MessageTraverser() : _visited = new _MessageTraverserVisitedMap();

  /** Visitor's entry point. */
  traverse(var x) {
    if (isPrimitive(x)) return visitPrimitive(x);
    _visited.reset();
    var result;
    try {
      result = _dispatch(x);
    } finally {
      _visited.cleanup();
    }
    return result;
  }

  _dispatch(var x) {
    if (isPrimitive(x)) return visitPrimitive(x);
    if (x is List) return visitList(x);
    if (x is Map) return visitMap(x);
    if (x is SendPort) return visitSendPort(x);
    if (x is SendPortSync) return visitSendPortSync(x);

    // Overridable fallback.
    return visitObject(x);
  }

  visitPrimitive(x);
  visitList(List x);
  visitMap(Map x);
  visitSendPort(SendPort x);
  visitSendPortSync(SendPortSync x);

  visitObject(Object x) {
    // TODO(floitsch): make this a real exception. (which one)?
    throw "Message serialization: Illegal value $x passed";
  }

  static bool isPrimitive(x) {
    return (x == null) || (x is String) || (x is num) || (x is bool);
  }
}


/** Visitor that serializes a message as a JSON array. */
abstract class _Serializer extends _MessageTraverser {
  int _nextFreeRefId = 0;

  visitPrimitive(x) => x;

  visitList(List list) {
    int copyId = _visited[list];
    if (copyId != null) return ['ref', copyId];

    int id = _nextFreeRefId++;
    _visited[list] = id;
    var jsArray = _serializeList(list);
    // TODO(floitsch): we are losing the generic type.
    return ['list', id, jsArray];
  }

  visitMap(Map map) {
    int copyId = _visited[map];
    if (copyId != null) return ['ref', copyId];

    int id = _nextFreeRefId++;
    _visited[map] = id;
    var keys = _serializeList(map.keys.toList());
    var values = _serializeList(map.values.toList());
    // TODO(floitsch): we are losing the generic type.
    return ['map', id, keys, values];
  }

  _serializeList(List list) {
    int len = list.length;
    var result = new List(len);
    for (int i = 0; i < len; i++) {
      result[i] = _dispatch(list[i]);
    }
    return result;
  }
}

/** Deserializes arrays created with [_Serializer]. */
abstract class _Deserializer {
  Map<int, dynamic> _deserialized;

  _Deserializer();

  static bool isPrimitive(x) {
    return (x == null) || (x is String) || (x is num) || (x is bool);
  }

  deserialize(x) {
    if (isPrimitive(x)) return x;
    // TODO(floitsch): this should be new HashMap<int, dynamic>()
    _deserialized = new HashMap();
    return _deserializeHelper(x);
  }

  _deserializeHelper(x) {
    if (isPrimitive(x)) return x;
    assert(x is List);
    switch (x[0]) {
      case 'ref': return _deserializeRef(x);
      case 'list': return _deserializeList(x);
      case 'map': return _deserializeMap(x);
      case 'sendport': return deserializeSendPort(x);
      default: return deserializeObject(x);
    }
  }

  _deserializeRef(List x) {
    int id = x[1];
    var result = _deserialized[id];
    assert(result != null);
    return result;
  }

  List _deserializeList(List x) {
    int id = x[1];
    // We rely on the fact that Dart-lists are directly mapped to Js-arrays.
    List dartList = x[2];
    _deserialized[id] = dartList;
    int len = dartList.length;
    for (int i = 0; i < len; i++) {
      dartList[i] = _deserializeHelper(dartList[i]);
    }
    return dartList;
  }

  Map _deserializeMap(List x) {
    Map result = new Map();
    int id = x[1];
    _deserialized[id] = result;
    List keys = x[2];
    List values = x[3];
    int len = keys.length;
    assert(len == values.length);
    for (int i = 0; i < len; i++) {
      var key = _deserializeHelper(keys[i]);
      var value = _deserializeHelper(values[i]);
      result[key] = value;
    }
    return result;
  }

  deserializeSendPort(List x);

  deserializeObject(List x) {
    // TODO(floitsch): Use real exception (which one?).
    throw "Unexpected serialized object";
  }
}

// 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) 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.


// This API is exploratory.
spawnDomFunction(Function topLevelFunction) => _Utils.spawnDomFunctionImpl(topLevelFunction);

// testRunner implementation.
// FIXME: provide a separate lib for testRunner.

var _testRunner;

TestRunner get testRunner {
  if (_testRunner == null)
    _testRunner = new TestRunner._(_NPObject.retrieve("testRunner"));
  return _testRunner;
}

class TestRunner {
  final _NPObject _npObject;

  TestRunner._(this._npObject);

  display() => _npObject.invoke('display');
  dumpAsText() => _npObject.invoke('dumpAsText');
  notifyDone() => _npObject.invoke('notifyDone');
  setCanOpenWindows() => _npObject.invoke('setCanOpenWindows');
  waitUntilDone() => _npObject.invoke('waitUntilDone');
}
// 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 _Utils {
  static double dateTimeToDouble(DateTime dateTime) =>
      dateTime.millisecondsSinceEpoch.toDouble();
  static DateTime doubleToDateTime(double dateTime) {
    try {
      return new DateTime.fromMillisecondsSinceEpoch(dateTime.toInt());
    } catch(_) {
      // TODO(antonnm): treat exceptions properly in bindings and
      // find out how to treat NaNs.
      return null;
    }
  }

  static List convertToList(List list) {
    // FIXME: [possible optimization]: do not copy the array if Dart_IsArray is fine w/ it.
    final length = list.length;
    List result = new List(length);
    result.setRange(0, length, list);
    return result;
  }

  static List convertMapToList(Map map) {
    List result = [];
    map.forEach((k, v) => result.addAll([k, v]));
    return result;
  }

  static void populateMap(Map result, List list) {
    for (int i = 0; i < list.length; i += 2) {
      result[list[i]] = list[i + 1];
    }
  }

  static bool isMap(obj) => obj is Map;

  static Map createMap() => {};

  static makeUnimplementedError(String fileName, int lineNo) {
    return new UnsupportedError('[info: $fileName:$lineNo]');
  }

  static window() native "Utils_window";
  static print(String message) native "Utils_print";
  static forwardingPrint(String message) native "Utils_forwardingPrint";
  static SendPort spawnDomFunctionImpl(Function topLevelFunction) native "Utils_spawnDomFunction";
  static int _getNewIsolateId() native "Utils_getNewIsolateId";
  static bool shadowRootSupported(Document document) native "Utils_shadowRootSupported";
}

class _NPObject extends NativeFieldWrapperClass1 {
  _NPObject.internal();
  static _NPObject retrieve(String key) native "NPObject_retrieve";
  property(String propertyName) native "NPObject_property";
  invoke(String methodName, [List args = null]) native "NPObject_invoke";
}

class _DOMWindowCrossFrame extends NativeFieldWrapperClass1 implements
    WindowBase {
  _DOMWindowCrossFrame.internal();

  // Fields.
  HistoryBase get history native "DOMWindow_history_cross_frame_Getter";
  LocationBase get location native "DOMWindow_location_cross_frame_Getter";
  bool get closed native "DOMWindow_closed_Getter";
  int get length native "DOMWindow_length_Getter";
  WindowBase get opener native "DOMWindow_opener_Getter";
  WindowBase get parent native "DOMWindow_parent_Getter";
  WindowBase get top native "DOMWindow_top_Getter";

  // Methods.
  void close() native "DOMWindow_close_Callback";
  void postMessage(/*SerializedScriptValue*/ message, String targetOrigin, [List messagePorts]) native "DOMWindow_postMessage_Callback";

  // Implementation support.
  String get typeName => "DOMWindow";
}

class _HistoryCrossFrame extends NativeFieldWrapperClass1 implements HistoryBase {
  _HistoryCrossFrame.internal();

  // Methods.
  void back() native "History_back_Callback";
  void forward() native "History_forward_Callback";
  void go(int distance) native "History_go_Callback";

  // Implementation support.
  String get typeName => "History";
}

class _LocationCrossFrame extends NativeFieldWrapperClass1 implements LocationBase {
  _LocationCrossFrame.internal();

  // Fields.
  void set href(String) native "Location_href_Setter";

  // Implementation support.
  String get typeName => "Location";
}

class _DOMStringMap extends NativeFieldWrapperClass1 implements Map<String, String> {
  _DOMStringMap.internal();

  bool containsValue(String value) => Maps.containsValue(this, value);
  bool containsKey(String key) native "DOMStringMap_containsKey_Callback";
  String operator [](String key) native "DOMStringMap_item_Callback";
  void operator []=(String key, String value) native "DOMStringMap_setItem_Callback";
  String putIfAbsent(String key, String ifAbsent()) => Maps.putIfAbsent(this, key, ifAbsent);
  String remove(String key) native "DOMStringMap_remove_Callback";
  void clear() => Maps.clear(this);
  void forEach(void f(String key, String value)) => Maps.forEach(this, f);
  Collection<String> get keys native "DOMStringMap_getKeys_Callback";
  Collection<String> get values => Maps.getValues(this);
  int get length => Maps.length(this);
  bool get isEmpty => Maps.isEmpty(this);
}

get _printClosure => (s) {
  try {
    window.console.log(s);
  } catch (_) {
    _Utils.print(s);
  }
};

final _forwardingPrintClosure = _Utils.forwardingPrint;
